2014-07-20 2 views
1

두 레일 모델의 연관성에 대해 작업하고 있습니다. 사용자와 게시물activerecord 연관을위한 외래 키가 있어야합니까?

나는 사용자와 게시물 사이에 has_many 연관과 belongs_to의 반대 관계를 가지고 있습니다.

사용자와 게시간에 has_one 연결을 설정하고 싶지만이 연결에서 Post to User의 외래 키는 원하지 않습니다. 예를

class User < ActiveRecord::Base 
    has_many :posts 
    has_one :current_post 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
end 

그래서 has_many에 대한

: 게시물 포스트에 USER_ID의 foreign_key을 가지고,하지만 난 current_post가이 역의 관계를 갖고 싶어하지 않습니다. 이를 수행 할 수있는 방법이 있습니까 (예 : has_one : current_post, : foreign_key => false)?

+0

조금 더 필요한 것이 무엇인지 설명해 주시겠습니까? current_post는 어떻게 사용됩니까? – Jay

답변

1

관계가 거꾸로되어있는 것처럼 보입니다. 외래 키는 실제로 연결을 만드는 것입니다. 연결이 없으면 아무 것도 연결되지 않습니다. 외래 키를 부모 개체를 가리키는 포인터 또는 주소라고 생각하십시오. 어떤 특정 자식은 부모의 외래 키를 저장하기 때문에 부모와 연관됩니다. 부모의 자식을 검색하려면 부모의 "has_one"또는 "has_many"를 지정한 유형의 자식 객체에서 해당 부모의 기본 키를 찾습니다. "has_many"와 외래 키가없는 경우에는 특정 오브젝트가 실제로 다른 오브젝트를 가리 키지 않으므로 관계가 생성되지 않습니다.

정말로 원하는 경우 할 수있는 일은 has_one 또는 has_many없이 belongs_to입니다. 그렇게하면, 자식이 부모 객체에 대한 포인터를 가지기 때문에, 자식 객체에서 부모 객체를 찾을 수 있습니다. 하지만 부모 모델에 자식이 있어야한다고 ActiveRecord에 말하지 않았기 때문에 부모가 가진 자식 개체를 찾는 것이 더 어렵다는 것을 알 수 있습니다.

예에서 User has_many postsPost belongs_to user은 문제가 없습니다. 그러나 User has_one current_post이라고 말하면 ActiveRecord는 존재하지 않는 키를 찾도록합니다.

문제를 해결하는 한 가지 방법은 항상 가장 최근 게시물의 외래 키를 사용자와 함께 저장하는 것입니다. 그것은 반대로 직관적이라고 말하면서 User belongs_to current_post라고 들리지만 그것이 당신이하고 싶다고 생각하는 것을 성취합니다.

즉, 최신 게시물 에 대한 키 저장은 전혀 필요하지 않을 수도 있습니다.. 타임 스탬프는 ActiveRecord가 생성하는 모든 모델로 자동 생성되므로 원하는 경우 가장 최근의 타임 스탬프가있는 게시물을 얻을 수 있습니다.