Rails`where`的时间少于查询
建立
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
一起出错ArgumentError: bad value for range
。
目前的简单解决方
User.where('`users`.`last_deposit` >= ?', 10.days.ago)
将生成相同的SQL,但如果这可以使用字符串以外的对象完成,我想这样做。
潜力(Meh)答案
这有点糟糕但可以使用Time.at(0)
和Time.at(Float::MAX)
来完成范围。 我觉得这些可能导致同样糟糕的SQL查询。
编辑
这在Rails 5中现在可以实现!
User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)
将生成SQL
SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').
原始(和Rails <5)答案
它似乎没有一种方法可以使用基本的哈希语法来生成大于或小于时间戳的查询。 在Current Simple Solution
下的问题中概述了最简单,最易读的方法。
另一种方法是使用ARel,但你必须做一些不太常见的调用。 首先,您可以获取AR类的ARel表的句柄,访问列,传递大于gt
的结果,大于或等于gteq
,小于lt
和/或小于或等于lteq
方法的结果争论到where
。
在上面的情况中,这将完成如下:
last_deposit_column = User.arel_table[:last_deposit] last_deposit_over_ten_days_ago = last_deposit_column.gteq(10.days.ago) User.where(last_deposit_over_ten_days_ago)
你试过这个吗?:
User.where(last_deposit: Time.at(0)...10.days.ago)
SQL:
SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '1970-01-01 00:00:00' AND `users`.`last_deposit` < '2015-01-10 17:15:19')
您需要使用适当的无穷大。 时间戳是DateTime
而不是Date
。 使用DateTime::Infinity.new
或DateTime::Infinity.new(-1)
表示负无限。
相关: 有没有办法在Ruby中表达“无限时间”?
试试这个:
User.where(last_deposit.gt(10.days.ago))