有关铁路协会的问题

时间:2009-12-18 02:38:10

标签: ruby-on-rails

考虑这段代码

class User < ActiveRecord::Base
  has_many :views
  has_many :posts, :through => :views, :uniq => true

  has_many :favorites
  has_many :posts, :through => :favorites, :uniq => true

  has_many :votes
  has_many :posts, :through => :votes, :uniq => true
end

# controller code

user = User.find(3)
posts = user.posts # ??

表示我通过不同的方式在帖子和用户之间建立了三种关系。但最后一行怎么样?如何通过视图或收藏夹告诉我想要获取帖子。

2 个答案:

答案 0 :(得分:4)

您可以为每个关联指定一个不同的名称,但使用:class_name选项将其指向同一模型。像这样:

class User < ActiveRecord::Base
  has_many :views
  has_many :view_posts, :through => :views, :class_name => 'Post', :uniq => true, 

  has_many :favorites
  has_many :favorite_posts, :through => :favorites, :class_name => 'Post', :uniq => true

  has_many :votes
  has_many :vote_posts, :through => :votes, :class_name => 'Post', :uniq => true
end

# Then...
User.find(3).favorite_posts

您可能还会发现named_scope有用。

答案 1 :(得分:1)

您必须为协会指定不同的名称。第2和第3 has_many :posts只是覆盖了之前的has_many :view_posts。您需要has_many :favorite_posts,{{1}}等等。