如何在活动记录范围内使用零最小值
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。
我在 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。