[ruby-on-rails] belongs_to와 has_one의 차이점은 무엇입니까?
a belongs_to
와 a 의 차이점은 무엇입니까 has_one
?
Ruby on Rails 가이드를 읽는 것이 도움이되지 않았습니다.
답변
그들은 본질적으로 같은 일을합니다. 유일한 차이점은 당신이 어떤 관계에 있는지입니다. A는 경우 User
A가 들어 Profile
, 다음에 User
클래스, 당신은 줄 has_one :profile
과에서 Profile
클래스, 당신은 것입니다 belongs_to :user
. 다른 객체를 누가 “가지고 있는지”결정하려면 외래 키가 어디에 있는지 살펴보십시오. 테이블에 열 이 있기 때문에 User
“있다” 라고 말할 수 있습니다 . 그러나 테이블에 호출 된 열이있는 경우 a 가 이고, belongs_to / has_one 위치가 바뀌 었다고 말할 수 있습니다.Profile
profiles
user_id
profile_id
users
Profile
User
여기 에 대한 자세한 설명입니다.
답변
외래 키가 어디에 있는지에 관한 것입니다.
class Foo < AR:Base
end
- foo
belongs_to :bar
인 경우 foos 테이블에는bar_id
열이 있습니다. - foo
has_one :bar
인 경우 bars 테이블에는foo_id
열이 있습니다.
귀하의 경우 개념적 수준에서, class A
이 has_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)
)
답변
has_one
그리고 belongs_to
일반적으로 그들은 다른 관련 모델에 지적하는 의미에서 동일합니다. belongs_to
이 모델에 foreign_key
정의 되어 있는지 확인하십시오 .
has_one
다른 모델 has_foreign
키가 정의되어 있는지 확인하십시오 .
보다 구체적으로,의 두 측면이 있습니다 relationship
. 하나는 Owner
입니다 Belongings
. 다른 하나는 입니다 . has_one
정의 된 경우 만 얻을 수 Belongings
있지만 Owner
에서를 가져올 수는 없습니다 belongings
. 추적하려면 소속 모델에서도 Owner
를 정의해야합니다 belongs_to
.
답변
내가 추가하고 싶은 한 가지 추가 사항은 다음과 같은 모델 연결이 있다고 가정합니다.
class Author < ApplicationRecord
has_many :books
end
위의 연결 만 작성하면 특정 저자의 모든 책을 다음과 같이 얻을 수 있습니다.
@books = @author.books
그러나 특정 책의 경우 해당 저자를 얻을 수 없습니다.
@author = @book.author
위의 코드가 작동하게하려면 다음과 같이 Book 모델에 연관을 추가해야합니다.
class Book < ApplicationRecord
belongs_to :author
end
이렇게하면 ‘author’메소드가 Book 모델에 추가됩니다.
자세한 모드는 안내서를 참조하십시오
답변
단순성 관점에서 belongs_to
보다 낫습니다. has_one
때문에 관계 has_one
를 적용하기 위해 외래 키가있는 모델 및 테이블에 다음 제약 조건을 추가해야합니다 has_one
.
validates :foreign_key, presence: true, uniqueness: true
- 외래 키에 데이터베이스 고유 인덱스를 추가하십시오.