【发布时间】:2014-07-19 03:05:50
【问题描述】:
设置
Rails 的where 方法可以采用散列中的范围来生成查询,该查询将搜索范围内的值。例如:
User.where(cash_money: 10..1000)
#=> SELECT `users`.* FROM `users` WHERE (`users`.`cash_money` BETWEEN 10 AND 1000)
这也可以与时间戳一起使用
User.where(last_deposit: 10.days.ago..1000.days.ago)
#=> SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` BETWEEN '2014-05-19 14:42:36' AND '2011-09-02 14:42:36')
我发现您可以使用这样的哈希语法对数字进行简单的小于或大于操作
User.where(cash_money: 10..Float::INFINITY)
#=> SELECT `users`.* FROM `users` WHERE (`users`.`cash_money` >= 10)
对于少于查询,-Float::INFINITY 也可以这样做。
问题
有没有办法用时间戳做到这一点,以便我可以得到如下查询?
SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2014-05-19 14:42:36')
我不能将Float::INFINITY 或Date::Infinity 与范围一起使用,因为它们都与ArgumentError: bad value for range 出错。
当前的简单解决方案
User.where('`users`.`last_deposit` >= ?', 10.days.ago)
将生成相同的 SQL,但如果这可以使用字符串以外的对象完成,我愿意这样做。
潜在(Meh)答案
这有点糟糕,但可以通过使用Time.at(0) 和Time.at(Float::MAX) 的范围来完成。我感觉这些可能会导致同样糟糕的 SQL 查询。
【问题讨论】:
-
我最讨厌 Active Record 的一个方面是 where() 子句中对 gt/lt-or-equals(或范围)没有明显和直观的支持!传递像“column >= ?”这样的字符串只是让我想知道为什么我不首先自己输入查询。
-
我的回答 on this question 提供了截至撰写本文时最新版本的 Ruby 和 Rails(分别为 3.0.2 和 6.1)的更多详细信息。
标签: mysql sql ruby-on-rails date arel