我需要在Rails5中使用Arel或ActiveRecord编写一个查询,使用交集和联合。到目前为止,我找到的关于这个问题的每一个答案似乎都涉及将OP给出的特定示例转换为另一种类型的查询。这对我不起作用,因为这些查询是以编程方式组合的,到目前为止,最明智的方法是将子查询作为子查询,然后使用INTERSECT和UNION连接这些子查询。
与&的交集和与|的联合完全可以工作,并且可以做我想做的事情,但是这两个返回数组都会毫无理由地将一个巨大的数据集放入内存中。
MyModel.where(...).intersect(MyModel.where(...))这种方法是可行的,但结果是Arel::Nodes::Intersect而不是ActiveRecord::Relation,这就没什么用处了。我试着直接使用Arel构建它们,但Arel缺乏文档,这让我很沮丧。
有没有一种更快速的方式来实现这一点,而且仍然是可链接的(例如,仍然可以像AR::Relation那样懒惰地分页)?
发布于 2017-04-25 09:37:13
对于INTERSECT,只需使用:
MyModel.where(...).where(...)或者,将其放在多行中是更好的语法:
MyModel\
.where(...)
.where(...)也可以使用where(nil),它不会对关系产生任何影响。当您以编程方式构造where条件(例如where({a: a_val} if a_val.present?)时,这很有用。
对于联合,请使用Rails 5 or
MyModel.where(...).or(MyModel.where(...))或者使用多行语法:
MyModel\
.where(...)
.or(
MyModel\
.where(...)
)https://stackoverflow.com/questions/43599060
复制相似问题