添加两个ActiveRecord :: Relation对象

时间:2012-09-06 04:34:37

标签: ruby ruby-on-rails-3

如何将两个关系加在一起?当我尝试+运算符时,它返回一个数组。但我需要它来回归关系。

感谢, 麦克

3 个答案:

答案 0 :(得分:7)

尝试:

new_relation = relation.merge(another_relation)

答案 1 :(得分:3)

您可以添加两个ActiveRecord :: Relation with Arel Constraints

constraints_1 = Model.matching_one.arel.constraints
constraints_2 = Model.matching_two.arel.constraints

Model.where(constraints_1.and(constraints_2)).class => ActiveRecord::Relation

您也可以使用或操作

Model.where(constraints_1.or(constraints_2)).class => ActiveRecord::Relation

真实的例子

constraints_1 = User.where(id: 1..5).arel.constraints
constraints_2 = User.where('id != 2').arel.constraints

User.where(constraints_1.and(constraints_2))

您可以观看有关http://railscasts.com/episodes/355-hacking-with-arel

的精彩屏幕演示

答案 2 :(得分:2)

如果要添加ActiveRecord :: Relation对象以获得“OR”结果而不是“AND”(通过链接获得“AND”行为),并且您仍然需要将结果作为ActiveRecord :: Relation与其他一些代码(例如meta_search)玩得很好....

def matching_one_or_two
  temp = Model.matching_one + Model.matching_two
  Model.where('id in (?)',temp.map(&:id))
end

当然不是世界上最伟大的表现,但它会导致ActiveRecord :: Relation对象指向'OR'结果。

您也可以直接将“OR”放入sql中,而不是让Rails为您生成它,以便为您的数据库应用程序提供更好的性能。一个例子:

Model.where(“table_name.col ='one'OR table_name.col ='two'”)

这也会返回一个ActiveRecord :: Relation对象。