#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, иначе он тоже не знал, что я имел в виду, но как только это было сделано, все прошло гладко!