rails 3中2个活动记录关系对象的联合

时间:2012-06-30 00:26:45

标签: ruby-on-rails-3 activerecord

我有一个由类代表的内容模型:内容。现在,用户可以评估内容审核内容或同时执行这两项操作。我想查找用户评级已审核评分和评论的所有内容。 评论表与内容表具有多对一关联(表示内容可以多次审核)。 评分表与内容表之间存在类似的关系。

我想我应该单独查询以查找用户的所有评分内容,然后由用户查看所有评论的内容,然后进行联合。但我无法找到如何做一个返回活动记录关系的联合。我需要一个关系,因为我想对结果进行分页。

谢谢。

2 个答案:

答案 0 :(得分:2)

好的,首先让我们设置你的模型。根据你的解释,我认为你会想要这样的东西:

class Content < ActiveRecord::Base
  has_many :reviews
  has_many :reviewing_users, :through => :reviews, :class_name => "User"

  has_many :ratings
  has_many :rating_users, :through => :ratings, :class_name => "User"
end

class User < ActiveRecord::Base
  has_many :reviews
  has_many :reviewed_contents, :through => :reviews, :class_name => "Content"

  has_many :ratings
  has_many :rated_contents, :through => :ratings, :class_name => "Content"
end

class Review < ActiveRecord::Base
  belongs_to :content
  belongs_to :user
end

class Rating < ActiveRecord::Base
  belongs_to :content
  belongs_to :user
end

然后,对于给定的用户,您可以找到他们已审核和/或评价过的所有内容:

( user.reviewed_contents + user.rated_contents ).uniq

答案 1 :(得分:2)

(user.reviewed_contents + user.rated_contents).uniq返回一个数组,而不是关系,所以要小心。您可以通过尝试在@posts(除了paginate之外)调用类方法来测试它。

你仍然可以分页。只需使用@posts.paginate,因为will_paginate gem会在数组类中添加 paginate 方法。