以编程方式使用Arel或ActiveRecord编写INTERSECT和UNION查询

时间:2017-04-24 23:09:23

标签: ruby-on-rails ruby postgresql activerecord arel

我需要使用交叉点和联合在Rails 5中使用Arel或ActiveRecord编写查询。到目前为止,我所发现的关于SO的每个答案通常似乎都涉及将OP提供的特定示例转换为另一种查询。这对我来说不起作用,因为这些查询是以编程方式编写的,到目前为止,最明智的方法是作为子查询,然后与INTERSECT和UNION结合。

&相交并与|联合完全有效,并完成我想要的工作,但这两个都返回数组,因此会将巨大的巨大数据集带入内存中很有道理。

MyModel.where(...).intersect(MyModel.where(...))

此类工作,但结果是Arel::Nodes::Intersect而不是ActiveRecord::Relation,这并非有用。我尝试直接使用Arel构建这些,但是由于Arel缺乏文档而感到沮丧。

是否有更多Railsy实现此方法仍然可以链接(即,仍然可以像AR :: Relation一样懒惰地分页)?

1 个答案:

答案 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(...)
)