使用Arel或ActiveRecord以编程方式编写INTERSECT和UNION查询
问题描述:
我需要使用Arel或ActiveRecord在Rails 5中使用交集和联合编写查询。对于我迄今为止发现的关于SO的每一个答案,似乎都涉及将OP给出的特定示例转换为另一种查询。这对我不起作用,因为这些查询是以编程方式编写的,迄今为止最明智的做法是将子查询与INTERSECT和UNION结合起来。使用Arel或ActiveRecord以编程方式编写INTERSECT和UNION查询
相交与&
与|
unioning完全工作,以及做什么,我也想,但是这两个回报阵列和,。因此,将带来巨大的庞大的数据集庞大到内存中没有很好的理由。
MyModel.where(...).intersect(MyModel.where(...))
这类作品,但结果是Arel::Nodes::Intersect
而非ActiveRecord::Relation
,这是不一样有用。我试着直接使用Arel来构建它们,但是由于Arel缺乏文档而感到沮丧。
是否还有更多的Railsy方式来实现这个功能仍然是可链接的(即,仍然可以像AR :: Relation一样懒惰地分页)?
答
对于相交时,只需使用:
MyModel.where(...).where(...)
,也可以是优雅的语法把它多行这样的:
MyModel\
.where(...)
.where(...)
您还可以使用其中(无),它会对关系没有影响。当您以编程方式构造where条件时(例如where({a: a_val} if a_val.present?
),这非常有用。
工会,使用Rails的5 or
:
MyModel.where(...).or(MyModel.where(...))
或具有多语法:
MyModel\
.where(...)
.or(
MyModel\
.where(...)
)
请阅读 “[问]” 和链接的网页,尤其是“[如何提问的智能方式](http://catb.org/esr/faqs/smart-questions.html)“。我们想知道你的尝试。为什么它不起作用。正如所写的,你要求我们抛出一般想法,而不是回答具体的问题,这是SO方式。 –
我不同意。我在问如何做一个非常具体的事情,使用ActiveRecord或Arel来表示两个查询在同一个表上的交集。它们存储为单独的变量,因此不能像第一个答案那样真正链接。我基本上已经尝试过所有的东西,最后用Arel直接编写了一个更强大的解决方案。 – max