where 语句中使用包含范围的条件哈希时,我的查询会出现一些奇怪的附加内容。User.where(id: [1..5])
和
User.where(id: [1...5])
分别执行以下查询,得到的结果如下:
SELECT `users`.* FROM `users` WHERE ((`users`.`id` BETWEEN 1 AND 5 OR 1=0))
SELECT `users`.* FROM `users` WHERE ((`users`.`id` >= 1 AND `users`.`id` < 5 OR 1=0))
OR FALSE
是一个无效操作,因此查询工作得非常好。我只是想知道为什么Rails或ARel要将这个片段添加到查询中。
编辑
看起来能够解释这个问题的代码在 ActiveRecord::PredicateBuilder
的第26行。但是还不清楚为什么此时哈希表会是空的?也许其他人知道。
编辑2
这很有趣。我正在查看 Filip 的评论,以了解他为什么要这样做,因为它似乎只是一个澄清,但他正确地指出,1..5 != [1..5]
。前者是从1到5的包含范围,而后者是其第一个元素就是前者的数组。我尝试将它们放入 ARel 的 where 调用中,以查看生成的 SQL,但没有出现 OR 1=0
!
User.where(id: 1..5) #=> SELECT "users".* FROM "users" WHERE ("users"."id" BETWEEN 1 AND 5)
User.where(id: 1...5) #=> SELECT "users".* FROM "users" WHERE ("users"."id" >= 1 AND "users"."id" < 5)
虽然我仍然不知道为什么ARel会添加OR 1=0
,它将始终为假且似乎是不必要的。这可能是由于处理Array
和Range
的方式不同。
[1..5].class #> Array
。a = [0,1,2,3,4,5,6];
a[1..4] #> [1,2,3,4]
@aaron - Filip Bartuzi