ruby-on-rails - 具有多个条件的 ActiveRecord AND + OR 条件

标签 ruby-on-rails activerecord where-clause

我正在使用 ActiveRecord 构建查询,但生成的 SQL 出现括号问题。

这是一个造成我的问题的查询

joined_users = User.joins(:consumer)

users = joined_users.where(id: (1..3), name: 'foo').or(joined_users.where(consumer: {id: (1...4))

它创建以下 SQL

SELECT "users".* FROM "users" INNER JOIN "consumers" "consumer" ON "consumer"."user_id" = "users"."id" WHERE ("users"."id" BETWEEN 1 AND 3 AND "users"."name" = 'foo' OR "consumer"."id" >= 1 AND "consumer"."id" < 4)

但实际上,应该是

SELECT "users".* FROM "users" INNER JOIN "consumers" "consumer" ON "consumer"."user_id" = "users"."id" WHERE (("users"."id" BETWEEN 1 AND 3 AND "users"."name" = 'foo') OR ("consumer"."id" >= 1 AND "consumer"."id" < 4))

你明白我的意思吗?

缺少用 or 分隔第一个 where 和第二个 where 的括号。

带括号和不带括号的 bool 逻辑完全不同。

我错过了什么?

最佳答案

根据您的具体情况,查询结果应该没有差异,因为逻辑 AND 运算符的优先级高于逻辑 OR,因此:

A && B || C && D 等于 (A && B) || (C && D)

ActiveRecord会在需要的时候添加括号,例如:

User.where(id: 1..3).or(User.where(id: 4...5)).where(email: 'some')

将导致:

SELECT "users".* FROM "users" WHERE ("users"."id" BETWEEN 1 AND 3 OR "users"."id" >= 4 AND "users"."id" < 5) AND "users"."email" = 'some'

关于ruby-on-rails - 具有多个条件的 ActiveRecord AND + OR 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71704437/

相关文章:

mysql - 如何在需要将日期字段与当前时间进行比较的 sql 查询中编写 where 子句?

ruby-on-rails - Controller 类中的 session 和 params 之间的区别

ruby-on-rails - 使用 has_many :through 时如何访问 Rails 连接模型属性

javascript - 使用 JSON 数据用数据库对象填充 Google map

ruby-on-rails - 迁移期间的 Ruby 工作流问题

ruby-on-rails - ActiveRecord 正在重置我之前定义的所有变量

php - 错误 WHERE SQL

Mysql "like"获取最相关的多个搜索词结果

ruby-on-rails - Rails 和 Github 操作 - 凭证

ruby-on-rails - Rails Scoped 有很多通过有很多范围