我正在使用 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/