Ruby on rails 如何在活动记录范围内使用零最小值

Ruby on rails 如何在活动记录范围内使用零最小值,ruby-on-rails,activerecord,ruby-on-rails-6,Ruby On Rails,Activerecord,Ruby On Rails 6,我在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

我在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
子句中使用
=
而不是在
之间使用
来正常工作。但是如果您使用
nil
最小值,而不是使用
,它看起来确实像ActiveRecord中的一个问题,您可以通过使用Arel或Float::INFINITY来解决它

Client.where(Client.arel_table[:id].gte(id))
Client.where(id: Float::INFINITY..3)

该问题已解决,将被后传到6.0。

它不是零最小值
.3
是从无穷大到3的范围。@最大值为“是”,但如果您使用
浮点::无穷大..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 cool!有没有链接可以让我看到这个?我在GitHub Rails 6.1 milestoneI上找不到它,实际上我不知道可以使用无限范围来创建GTE,这非常酷。如果这被报告为bug,您可能希望检查问题,否则提交问题。谢谢我将把它标记为最佳答案-不确定是否应该更新它以反映问题已在>6.0.2.2中解决的事实