我需要使用交叉点和联合在Rails 5中使用Arel或ActiveRecord编写查询。到目前为止,我所发现的关于SO的每个答案通常似乎都涉及将OP提供的特定示例转换为另一种查询。这对我来说不起作用,因为这些查询是以编程方式编写的,到目前为止,最明智的方法是作为子查询,然后与INTERSECT和UNION结合。
与&
相交并与|
联合完全有效,并完成我想要的工作,但这两个都返回数组,因此会将巨大的巨大数据集带入内存中很有道理。
MyModel.where(...).intersect(MyModel.where(...))
此类工作,但结果是Arel::Nodes::Intersect
而不是ActiveRecord::Relation
,这并非有用。我尝试直接使用Arel构建这些,但是由于Arel缺乏文档而感到沮丧。
是否有更多Railsy实现此方法仍然可以链接(即,仍然可以像AR :: Relation一样懒惰地分页)?
答案 0 :(得分:-1)
对于INTERSECT,只需使用:
MyModel.where(...).where(...)
或者它可以是更好的语法,使它像这样多行:
MyModel\
.where(...)
.where(...)
你也可以使用where(nil),它对关系没有影响。当您以编程方式构建where条件(例如where({a: a_val} if a_val.present?
)时,这非常有用。
对于UNION,请使用Rails 5 or
:
MyModel.where(...).or(MyModel.where(...))
或使用多行语法:
MyModel\
.where(...)
.or(
MyModel\
.where(...)
)