ruby-on-rails 如何在ActiveRecord中使用beginless range

pkmbmrz7  于 2023-05-30  发布在  Ruby
关注(0)|答案(1)|浏览(169)

我在Rails www.example.com中得到了一些不一致的行为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中的一个问题吗?有推荐的解决方法吗?

x759pob2

x759pob21#

这看起来像是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。

相关问题