2010-04-09 123 views
8

您好,我正在做一個小型站點來幫助我和朋友學習語言。 典型用途:如何將一個模型與另一個模型關聯兩次

亞當是英語,但學習日語。 亞當可以通過寫作和提交用日語寫成的文章來練習他的日語。 亞當不能提交用他的母語寫的任何文章。 亞當可以閱讀正在學習英語的其他用戶的文章(用英語書寫)

我試圖去思考如何對這個模型進行建模,它的證明比標準的導軌更難,這些標準導軌有許多屬於我習慣的關聯至。

生病需要的功能像

-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

感謝米蘭多數民衆贊成,這是什麼名字這種類型的協會? – robodisco 2010-04-09 13:22:26

+0

用戶和文章之間的關聯通常被認爲是「has_many:through」。 – 2010-04-09 16:35:06

相關問題