如何使用逻辑OR而不是AND组合两个不同的条件?

NOTE:2个条件是作为rails作用域生成的,不容易直接更改为类似where("x or y")的值.

简单的例子:

admins = User.where(:kind => :admin)
authors = User.where(:kind => :author)

应用和条件很容易(对于这种特殊情况来说,这是毫无意义的):

(admins.merge authors).to_sql
#=> select ... from ... where kind = 'admin' AND kind = 'author'

但是,如果已经有两种不同的Arel关系可用,如何生成以下查询?

#=> select ... from ... where kind = 'admin' OR kind = 'author'

似乎(according to Arel readme):

OR运算符尚不受支持

但我希望它不适用于这里,我希望它能写出这样的东西:

(admins.or authors).to_sql

推荐答案

我go 派对有点晚了,但我有个最好的建议:

admins = User.where(:kind => :admin)
authors = User.where(:kind => :author)

admins = admins.where_values.reduce(:and)
authors = authors.where_values.reduce(:and)

User.where(admins.or(authors)).to_sql
# => "SELECT \"users\".* FROM \"users\"  WHERE ((\"users\".\"kind\" = 'admin' OR \"users\".\"kind\" = 'author'))"

Sql相关问答推荐

在SELECT陈述中使用子查询提高查询性能

根据内容确定要插入的列

当编号和版本的唯一状态更改时报告

表名数组

如何从上一个值减go 值

使用来自不同深度的嵌套组的值执行计算的干净方法?

R中对Arrow duckdb工作流的SQL查询

在数据库中搜索列

在PostgreSQL中汇总连接表中的 case 值

根据是否出现过零来筛选数据(跨多行)

删除所有订单中可用的重复值

如何使用jsonn_populate_record()插入到包含IDENTITY列的表中

按二维数组的第一个元素排序

Postgresql 生成器列导致语法错误

SQL 搜索 - 获取最大值日期的奇怪行为

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

检索具有相同位置的最小和最大store 数量

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

如何根据 ID 和指标从 2 个表中找到不同的值?

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON