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

How to use nil minimum in active record range

我在 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  AND  LIMIT   [["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" >=  LIMIT   [["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  AND  LIMIT   [["id", nil], ["id", 3], ["LIMIT", 10]]
=> []

似乎如果您使用范围内的 nil 最大值,通过在 where 子句中使用 >= 而不是 between,它会按预期工作。但是如果你使用一个nil最小值,而不是使用<=,它仍然使用between,这returns没有结果。这是 ActiveRecord 中的问题吗,是否有推荐的解决方法?

它看起来像是 ActiveRecord 中的一个问题,您可以使用 Arel 或 Float::INFINITY 来绕过它。

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

问题 is solved in Rails 6.1 将被移植到 6.0。