【问题标题】:How to use nil minimum in active record range如何在活动记录范围内使用 nil minimum
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我其实不知道你可以使用无限范围来创建非常酷的 GTE。如果这已被报告为错误,您可能需要检查问题,否则提交问题。 edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html
  • 谢谢!我将把它标记为最佳答案 - 不确定是否应该更新它以反映问题在 > 6.0.2.2 中得到解决的事实
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多