1

今日の前後の特定の日数で作成されたエントリを検索できるようにしたいと考えています。タイムスタンプを含むモデルがいくつかあります。データベースには約 70k のレコードがあるため、.all.each の実行には非常に長い時間がかかります。

私は次のようなことをしたいと思っていました

Model.find_by_updated_at(Date.today - 1)

updated_at は実際には Date ではなく Time クラスを返すようです。分や秒まで正確なので、次のようなことはできません

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

私のリクエストは、特定の日に変更されたモデルのみを検索するためです。

検索を使用してこれを行う方法はありますか?

find を使用する代わりに独自の SQL クエリを作成できると思いますが、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時間で保存する場合は、開始時間と終了時間を調整する必要があります。そうしないと、UTC00: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 に答える