【发布时间】:2020-03-20 15:48:29
【问题描述】:
我在 Rails 6.0.2.2 中遇到了一些不一致的行为,范围:
[49] pry(main)> Client.where(id: 1..3).limit(10).ids
(8.0ms) SELECT "clients"."id" FROM "clients" WHERE "clients"."id" BETWEEN $1 AND $2 LIMIT $3 [["id", 1], ["id", 3], ["LIMIT", 10]]
=> [1, 2, 3]
[50] pry(main)> Client.where(id: 1..).limit(10).ids
(0.5ms) SELECT "clients"."id" FROM "clients" WHERE "clients"."id" >= $1 LIMIT $2 [["id", 1], ["LIMIT", 10]]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[51] pry(main)> Client.where(id: ..3).limit(10).ids
(0.4ms) SELECT "clients"."id" FROM "clients" WHERE "clients"."id" BETWEEN $1 AND $2 LIMIT $3 [["id", nil], ["id", 3], ["LIMIT", 10]]
=> []
如果您在某个范围内使用nil 最大值,则似乎可以通过在where 子句中使用>= 而不是between 来按预期工作。但是,如果您使用nil 最小值,而不是使用<=,它仍然使用between,它不会返回任何结果。这是 ActiveRecord 中的问题吗?有推荐的解决方法吗?
【问题讨论】:
-
它不是一个零最小值。
..3是从无穷大到 3 的范围。 -
@max 是的,但如果你这样做
Float::INFINITY..3,这实际上是有效的。你会得到[1,2,3]回来。我刚刚意识到无始范围只在 Ruby 2.7 中添加,无限范围是在 Ruby 2.6 中添加的。所以看起来 Rails 还没有为 Ruby 2.7 添加这个 -
啊,很容易明白为什么当您执行
Float::INFINITY..3.begin == Float::INFINITY.和..3.begin == nil时会发生这种情况 -
这实际上已在 6.1 中修复,并且计划将修复程序向后移植到 6.0。
-
@max 酷!有没有可以看到这个的链接?我在 GitHub Rails 6.1 里程碑上找不到它
标签: ruby-on-rails activerecord ruby-on-rails-6