【问题标题】:Union of 2 active record relation object in rails 3rails 3中2个活动记录关系对象的联合
【发布时间】:2012-06-30 00:26:45
【问题描述】:
我有一个由类表示的内容模型:content。现在用户可以评价内容、评论内容或两者兼而有之。我想找到用户评价、评价或评价和评价的所有内容。 reviews 表与 content 表具有多对一的关联(意味着可以多次查看内容)。 ratings 表和 content 表之间存在类似的关系。
我想我应该进行单独的查询以查找用户的所有评分内容,然后查找用户的所有评论内容,然后进行联合。但我不知道如何做一个返回活动记录关系的联合。我需要一个关系,因为我想对结果进行分页。
谢谢。
【问题讨论】:
标签:
ruby-on-rails-3
activerecord
【解决方案1】:
好的,首先让我们设置您的模型。根据您的解释,我认为您会想要这样的东西:
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
【解决方案2】:
(user.reviewed_contents + user.rated_contents).uniq 返回一个数组,而不是一个关系,所以要小心。您可以通过尝试在 @posts(分页除外)上调用类方法来测试这一点。
你仍然可以分页。只需使用@posts.paginate,因为will_paginate gem 将paginate 方法添加到数组类。