You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Arel::Nodes::Intersect动态构建多查询结果取交集的语句?

动态构建Arel多查询交集的实现方法

错误原因

你当前的写法存在两个核心问题:

  • Array#each遍历结束后返回的是原数组本身,不会返回块内生成的Language.where查询实例,需要改用Array#map收集所有查询对象。
  • Arel::Nodes::Intersect.new接收的是多个独立的位置参数,不能直接传入数组,需要用Ruby的数组展开运算符*将数组拆分为独立参数传入。

实现代码

写法1:直接展开参数(适用于支持多参数传入Intersect的Arel版本)

keys = [1,2,3]
# 生成所有查询对象的数组
queries = keys.map { |key| Language.where(foreign_key: key) }
# 展开数组作为参数构造Intersect对象
arel = Arel::Nodes::Intersect.new(*queries)

写法2:reduce累加构造(全版本兼容,支持任意数量的查询交集)

如果你的Arel版本仅支持Intersect.new传入2个参数,可以用累加的方式构造多交集逻辑:

keys = [1,2,3]
arel = keys.map { |key| Language.where(foreign_key: key) }.reduce do |left_query, right_query|
  Arel::Nodes::Intersect.new(left_query, right_query)
end

执行查询获取结果

构造完成的arel对象可通过如下方式执行得到查询结果:

results = Language.find_by_sql(arel.to_sql)

内容的提问来源于stack exchange,提问作者Max Rose-Collins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:06:03