Activerecord和+或有多个标准的条件
我正在使用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))
明白我的意思吗?
缺少括号将第一个分隔为,其中用或
将其分开。
在有和没有这些括号的情况下,Bool逻辑完全不一样。
我想念什么?
I'm using ActiveRecord
to build a query and I got a parenthesis issue with generated SQL.
Here is a query creating my problem
joined_users = User.joins(:consumer)
users = joined_users.where(id: (1..3), name: 'foo').or(joined_users.where(consumer: {id: (1...4))
It creates the following 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)
But actually, it should be
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))
Do you get my point?
There are missing parenthesis separating the first where
to the second with the or
.
Bool logic is not the same at all with and without these parenthesis.
What am I missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在您的特定情况下,查询结果应该没有差异,因为逻辑 AND 运算符比逻辑 OR 具有更高的优先级,因此:
A &&乙|| C&& D
等于(A && B) || (C && D)
ActiveRecord 会在需要时添加括号,例如:
将导致:
I your particular case there should be no difference in query result, because logical AND operator has higher priority than logical OR, so:
A && B || C && D
equals(A && B) || (C && D)
ActiveRecord will add parenthesis when it is needed, for example:
Will result in: