【发布时间】:2014-03-20 02:57:22
【问题描述】:
我正在进行的项目是在 RDS 上使用 MySQL(特别是 mysql2 gem)。
当我在 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 将这个 sn-p 添加到查询中。
编辑
看起来可以解释的那一行是line 26 in ActiveRecord::PredicateBuilder。那时仍然不知道哈希值如何是empty?,但也许其他人会这样做。
编辑 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,这将始终是错误的,并且似乎没有必要。这可能是因为Arrays 和Ranges 的处理方式不同。
【问题讨论】:
-
[1..5] 不是范围。
[1..5].class #> Array。a = [0,1,2,3,4,5,6];a[1..4] #> [1,2,3,4]@aaron
标签: mysql ruby-on-rails between