belongs_to와 has_one의 차이점은 무엇입니까?


답변:


241

그들은 본질적으로 같은 일을합니다. 유일한 차이점은 당신이 어떤 관계에 있는지입니다. A는 경우 UserA가 들어 Profile, 다음에 User클래스, 당신은 줄 has_one :profile과에서 Profile클래스, 당신은 것입니다 belongs_to :user. 다른 객체를 누가 "가지고 있는지"결정하려면 외래 키가 어디에 있는지 살펴보십시오. 테이블에 열 이 있기 때문에 User"있다" 라고 말할 수 있습니다 . 그러나 테이블에 호출 된 열이있는 경우 a 가 이고, belongs_to / has_one 위치가 바뀌 었다고 말할 수 있습니다.Profileprofilesuser_idprofile_idusersProfileUser

여기 에 대한 자세한 설명입니다.


알았어요, has_a는 속성이고, 소속은 관계에 가깝습니다.
Blankman

48
그래서 정말 짧게 대답 : Product belongs_to Shop수단의 products테이블이 shop_id컬럼
요 Ludke

@ryeguy, 이것이 자기 조인 관계라면 어떨까요?
Arian Faurtosh

49

외래 키가 어디에 있는지에 관한 것입니다.

class Foo < AR:Base
end
  • foo belongs_to :bar인 경우 foos 테이블에는 bar_id열이 있습니다.
  • foo has_one :bar인 경우 bars 테이블에는 foo_id열이 있습니다.

귀하의 경우 개념적 수준에서, class Ahas_one과의 관계 class B다음을 class A의 부모 class B따라서 귀하의 class B해야합니다 belongs_to과의 관계 class A가의 자식이기 때문에를 class A.

둘 다 1-1 관계를 나타냅니다. 차이점은 대부분 외래 키를 배치 할 위치이며 belongs_to관계를 선언하는 클래스의 테이블에 있습니다.

class User < ActiveRecord::Base
  # I reference an account.
  belongs_to :account
end

class Account < ActiveRecord::Base
  # One user references me.
  has_one :user
end

이 클래스의 테이블은 다음과 같습니다.

CREATE TABLE users (
  id int(11) NOT NULL auto_increment,
  account_id int(11) default NULL,
  name varchar default NULL,
  PRIMARY KEY  (id)
)

CREATE TABLE accounts (
  id int(11) NOT NULL auto_increment,
  name varchar default NULL,
  PRIMARY KEY  (id)
)

그것은 이미 2 년 전의 주에서 받아 들인 대답과 거의 같습니다.
matthias krull

11
이것은 훨씬 더 나은 대답입니다.
typeoneerror

의 사용 AccountUser종종 계정이 많은 사용자를 가질 수있는 경우이기 때문에이 예제는 불행한 일이다.
karmakaze

5

has_one그리고 belongs_to일반적으로 그들은 다른 관련 모델에 지적하는 의미에서 동일합니다. belongs_to이 모델에 foreign_key정의 되어 있는지 확인하십시오 . has_one다른 모델 has_foreign키가 정의되어 있는지 확인하십시오 .

보다 구체적으로,의 두 측면이 있습니다 relationship. 하나는 Owner입니다 Belongings. 다른 하나는 입니다 . has_one정의 된 경우 만 얻을 수 Belongings있지만 Owner에서를 가져올 수는 없습니다 belongings. 추적하려면 소속 모델에서도 Owner를 정의해야합니다 belongs_to.


3

내가 추가하고 싶은 한 가지 추가 사항은 다음과 같은 모델 연결이 있다고 가정합니다.

class Author < ApplicationRecord has_many :books end

위의 연결 만 작성하면 특정 저자의 모든 책을 다음과 같이 얻을 수 있습니다.

@books = @author.books

그러나 특정 책의 경우 해당 저자를 얻을 수 없습니다.

@author = @book.author

위의 코드가 작동하게하려면 다음과 같이 Book 모델에 연관을 추가해야합니다.

class Book < ApplicationRecord
  belongs_to :author
end

이렇게하면 'author'메소드가 Book 모델에 추가됩니다.
자세한 모드는 안내서를 참조하십시오


0

단순성 관점에서 belongs_to보다 낫습니다. has_one때문에 관계 has_one를 적용하기 위해 외래 키가있는 모델 및 테이블에 다음 제약 조건을 추가해야합니다 has_one.

  • validates :foreign_key, presence: true, uniqueness: true
  • 외래 키에 데이터베이스 고유 인덱스를 추가하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.