我希望能够在今天之前或之后找到创建一定天数的条目。我有一些包含时间戳的模型。数据库中大约有70,000条记录正在运行.all.each需要相当长的时间。
我希望做一些像
这样的事情Model.find_by_updated_at(Date.today - 1)
看来,updated_at实际上返回的是Time类,而不是Date;因为它精确到几分钟和几秒钟,我不能做像
这样的事情Model.find_by_updated_at(Time.now + 10000) # ten thousand seconds
因为我的请求只想查找特定日期更改的模型。
使用find有没有办法做到这一点?
我想我可以编写自己的SQL查询而不是使用find但我不知道如何构建它以排除通过hh:mm:ss搜索并只查看日期。
答案 0 :(得分:2)
您的查询正在查找在特定时间创建的模型。您可能想要的是返回在特定时间之后创建的内容:
Model.where('updated_at>=?', Date.today - 1)
或许在一个范围内:
Model.where('updated_at BETWEEN ? AND ?', Date.today - 1, Date.today)
有几种方法可以做到这一点。如果您经常这样做,您可能会发现创建可索引DATE
列的速度更快。
另一种方法是动态地执行:
Model.where('DATE(updated_at)=?', Date.today - 1)
几乎总是可以在ActiveRecord术语中表达您想要的内容而无需编写自己的查询。事实上,除非你有充分的理由要求你的代码更易于维护,否则最好不要这样做。
请记住,“日”充其量是一个相当模糊的概念。如果您以UTC时间存储数据,则需要对开始和结束时间进行调整,或者您将使用UTC 00:00:00作为日期的开始。这可能与您的期望不符。
答案 1 :(得分:1)
您可以在模型上创建一个如下所示的方法:
def self.updated_on_date(date)
where('updated_at BETWEEN ? AND ?', date.beginning_of_day, date.end_of_day)
end
然后你就可以这样称呼它
Model.updated_on_date(Date.today-1)