考虑这段代码
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 # ??
表示我通过不同的方式在帖子和用户之间建立了三种关系。但最后一行怎么样?如何通过视图或收藏夹告诉我想要获取帖子。
答案 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}}等等。