首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Arel或ActiveRecord以编程方式组合INTERSECT和UNION查询

用Arel或ActiveRecord以编程方式组合INTERSECT和UNION查询
EN

Stack Overflow用户
提问于 2017-04-25 07:09:23
回答 1查看 769关注 0票数 2

我需要在Rails5中使用Arel或ActiveRecord编写一个查询,使用交集和联合。到目前为止,我找到的关于这个问题的每一个答案似乎都涉及将OP给出的特定示例转换为另一种类型的查询。这对我不起作用,因为这些查询是以编程方式组合的,到目前为止,最明智的方法是将子查询作为子查询,然后使用INTERSECT和UNION连接这些子查询。

&的交集和与|的联合完全可以工作,并且可以做我想做的事情,但是这两个返回数组都会毫无理由地将一个巨大的数据集放入内存中。

代码语言:javascript
复制
MyModel.where(...).intersect(MyModel.where(...))

这种方法是可行的,但结果是Arel::Nodes::Intersect而不是ActiveRecord::Relation,这就没什么用处了。我试着直接使用Arel构建它们,但Arel缺乏文档,这让我很沮丧。

有没有一种更快速的方式来实现这一点,而且仍然是可链接的(例如,仍然可以像AR::Relation那样懒惰地分页)?

EN

回答 1

Stack Overflow用户

发布于 2017-04-25 09:37:13

对于INTERSECT,只需使用:

代码语言:javascript
复制
MyModel.where(...).where(...)

或者,将其放在多行中是更好的语法:

代码语言:javascript
复制
MyModel\
.where(...)
.where(...)

也可以使用where(nil),它不会对关系产生任何影响。当您以编程方式构造where条件(例如where({a: a_val} if a_val.present?)时,这很有用。

对于联合,请使用Rails 5 or

代码语言:javascript
复制
MyModel.where(...).or(MyModel.where(...))

或者使用多行语法:

代码语言:javascript
复制
MyModel\
.where(...)
.or(
MyModel\
.where(...)
)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43599060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档