문제

이 질문에는 이미 답변이 있습니다.

나는 이해하려고 노력하고 있습니다 has_one RoR의 관계.

두 가지 모델이 있다고 가정 해 보겠습니다. Person 그리고 Cell:

class Person < ActiveRecord::Base
  has_one :cell
end

class Cell < ActiveRecord::Base
  belongs_to :person
end

그냥 사용해도 되나요 has_one :person 대신에 belongs_to :person ~에 Cell 모델?

똑같지 않나요?

도움이 되었습니까?

해결책

아니요, 서로 바꿔 사용할 수 없으며 실제적인 차이점이 있습니다.

belongs_to 이는 외래 키가 이 클래스의 테이블에 있음을 의미합니다.그래서 belongs_to 외래 키를 보유한 클래스에만 들어갈 수 있습니다.

has_one 이는 이 클래스를 참조하는 다른 테이블에 외래 키가 있음을 의미합니다.그래서 has_one 다른 테이블의 열에서 참조하는 클래스에만 들어갈 수 있습니다.

그래서 이것은 잘못된 것입니다:

class Person < ActiveRecord::Base
  has_one :cell # the cell table has a person_id
end

class Cell < ActiveRecord::Base
  has_one :person # the person table has a cell_id
end

그리고 이것도 잘못된 것입니다:

class Person < ActiveRecord::Base
  belongs_to :cell # the person table has a cell_id
end

class Cell < ActiveRecord::Base
  belongs_to :person # the cell table has a person_id
end

올바른 방법은 (만약 Cell 포함 person_id 필드):

class Person < ActiveRecord::Base
  has_one :cell # the person table does not have 'joining' info
end

class Cell < ActiveRecord::Base
  belongs_to :person # the cell table has a person_id
end

양방향 연결을 위해서는 각각 하나씩이 필요하며 올바른 클래스에 들어가야 합니다.단방향 연결의 경우에도 어떤 연결을 사용하는지가 중요합니다.

다른 팁

"속성 _to"를 추가하면 양방향 협회가 있습니다. 그것은 당신이 세포에서 사람을 얻을 수 있고 그 사람의 세포를 얻을 수 있음을 의미합니다.

실제 차이는 없습니다. 두 가지 접근 방식 ( "SONGS_TO"가 있거나없는 경우)은 동일한 데이터베이스 스키마 (셀 데이터베이스 테이블의 Person_ID 필드)를 사용합니다.

요약하려면 : 모델 간의 양방향 연관성이 필요하지 않는 한 "속임수 _to"를 추가하지 마십시오.

둘 다 사용하면 사람과 셀 모델 모두에서 정보를 얻을 수 있습니다.

@cell.person.whatever_info and @person.cell.whatever_info.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top