Как настроить несколько has_many через отношения в Rails3, зависящие от поля в таблице объединения

#ruby-on-rails #activerecord #has-many-through

#ruby-on-rails #activerecord #имеет много сквозных

Вопрос:

Вероятно, это действительно просто, но я все еще вроде как начинаю rails и, похоже, не могу подобрать правильную фразу для ввода в Google, чтобы найти ответ.

У меня есть довольно простое сквозное отношение has_many, описанное ниже:

Пользователь
-user_id
-name

Статья
— article_id
— title

Article_Relationship
— идентификатор пользователя
— article_id
— relationship_type

В зависимости от типа отношений, это была бы строка или int для представления типа отношений, например, favorite, recently_viewed, writen_by и т.д. Как настроить несколько has_many:articles, :through => :article_relationships, чтобы я мог легко получить доступ к статьям определенного типа отношений через что-то вроде user.recently_viewed, user.favorite и т.д.?

Большое спасибо.

Ответ №1:

Вы на правильном пути, но вам просто нужно использовать области:

 class Article < ActiveRecord::Base
  # Here RECENTLY_VIEWED_TYPE refers to the type of relationship, whatever
  # that constant is defined as.
  scope :recently_viewed,
    where('article_relationships.relationship_type=?', RECENTLY_VIEWED_TYPE)
end
  

Затем вы можете получить к этому доступ напрямую от пользователя:

 @user.articles.recently_viewed.all
  

Ответ №2:

Вы можете перейти :conditions в has_many вместе с вашим :through вариантом. Вы также можете назвать ассоциацию как-нибудь по-другому. Таким образом, это дает вам возможность делать что-то вроде:

 class User < ActiveRecord::Base
  has_many :article_relationships
  has_many :articles, :through => :article_relationships

  has_many :recently_viewed_articles, :class_name => 'Article', :through => :article_relationships, :conditions => ['article_relationships.relationship_type = ?', 1]

  has_many :favorite_articles, :class_name => 'Article', :through => :article_relationships, :conditions => ['article_relationships.relationship_type = ?', 2]
end
  

Возможно, вам придется немного поиграть с параметрами, переданными в has_many , но вы поняли идею.

Комментарии:

1. Казалось, это сработало хорошо! Спасибо! Мне пришлось добавить:source => ‘article’ в дополнение к остальным параметрам has_many, иначе он тоже не знал, что я имел в виду, но как только это было сделано, все прошло гладко!