如何基于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
相关产品推荐
相关产品推荐

