как связать одну модель дважды с другой - PullRequest
8 голосов
/ 09 апреля 2010

Привет, я создаю небольшой сайт, чтобы помочь мне и друзьям изучать языки. Типичное использование:

Адам английский, но изучает японский. Адам может практиковать свой японский, написав и отправив статьи, написанные на японском языке Адам не может (не разрешается) представлять любые статьи, написанные на его родном языке. Адам может читать статьи (написанные на английском языке) другими пользователями, которые изучают английский

Я пытаюсь придумать, как смоделировать это, и это оказывается более сложным, чем у стандартных рельсов, ко многим относится к ассоциациям, к которым я привык.

Мне понадобится такая функциональность, как

-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.

1 Ответ

18 голосов
/ 09 апреля 2010

Да, ты прав. Связь между пользователем и языком имеет две стороны. Это довольно легко смоделировать с помощью 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

Нечто подобное должно работать.

...