1

我希望能够找到在今天之前或之后特定天数创建的条目。我有一些包含时间戳的模型。数据库中有大约 70k 条记录,因此运行 .all.each 需要很长时间。

我希望做类似的事情

Model.find_by_updated_at(Date.today - 1)

似乎 updated_at 实际上返回类时间,而不是日期;而且因为它精确到分钟和秒,我不能做类似的事情

Model.find_by_updated_at(Time.now + 10000) # ten thousand seconds

因为我的请求只想找到在特定日期更改的模型。

有没有办法使用 find 来做到这一点?

我想我可以编写自己的 SQL 查询而不是使用 find 但我不确定如何构造它以排除通过 hh:mm:ss 进行的搜索而只查看日期。

4

2 回答 2

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 作为您一天的开始时间。这可能与您的期望不符。

于 2012-09-07T01:23:13.227 回答
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)
于 2012-09-07T01:34:17.823 回答