2010-04-09 4 views
8

안녕하세요 저는 친구들이 언어를 배우는 데 도움이되는 작은 사이트를 만들고 있습니다. 대표적인 사용 :하나의 모델을 다른 모델과 두 번 연관시키는 방법

Adam은 영어이지만 일본어를 배우고 있습니다. Adam은 japanese로 작성된 기사를 작성하고 제출함으로써 자신의 일본어를 연습 할 수 있습니다. Adam은 모국어로 작성된 기사를 제출할 수 없습니다 (허용되지 않음). Adam은 영어를 배우는 다른 사용자가 영어로 작성한 기사를 읽을 수 있음

이 모델을 만드는 방법과 그 증명이 표준 레일보다 더 어렵다는 생각을하고 있습니다. 많은 사람들이 제가 익숙한 협회에 속해 있습니다. 에. 나는 사용자, 기사 및 언어 모델이 필요

-show all articles written in adams native language 
@adam.native_language.articles 

-show all posts written by users just like adam (i.e. learning the same language) 
@adam.foreign_language.articles 

-perhaps showing all posts written by language learners in one particular language 
@language => Japanese 
@langauge.posts 

처럼

일리노이 필요 기능. 그러나 언어와 사용자 모델을 어떻게 연관시킬 수 있습니까? 한 번은 native_language에 대해 한 번, foreign_language에 대해 한 번 사용자 모델과 두 번 연관되어야한다고 생각합니다.

답변

18

네 말이 맞아. 사용자와 언어 간의 연관성은 두 가지입니다. Rails를 사용하여이 상황을 모델링하는 것은 매우 쉽습니다.

class Language < AR::Base 
    has_many :native_speakers, :class_name => "User", :foreign_key => "native_language_id" 
    has_many :second_language_speakers, :class_name => "User", :foreign_key => "second_language_id" 
    has_many :articles 
end 

class User < AR::Base 
    # we expect the users table to have native_language_id and second_language_id columns 
    belongs_to :native_language, :class_name => "Language" 
    belongs_to :second_language, :class_name => "Language" 
    has_many :second_language_articles, :through => :second_language, :source => :articles 
    has_many :native_language_articles, :through => :native_language, :source => :articles 
end 

class Article < AR::Base 
    belongs_to :language 
end 

그런 식으로 작동해야합니다.

+0

감사합니다. milan thats excellent !,이 유형의 연결 이름은 무엇입니까? – robodisco

+0

사용자와 기사 간의 연결은 일반적으로 "has_many : through"로 지정됩니다. –

관련 문제