Как настроить несколько has_many через отношения в Rails3 в зависимости от поля в присоединяемой таблице - PullRequest
0 голосов
/ 30 апреля 2011

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

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

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

Статья
- article_id
- название

Article_Relationship
- user_id
- article_id
- тип_отношения

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

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

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

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

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
0 голосов
/ 30 апреля 2011

Вы можете передать :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, но вы поняли идею.

...