Date.today
メソッドを使用しているときに、現在の時刻に関してログに非常に奇妙な問題があることに気付きました。基本的に、毎晩00:00に実行されるcronジョブ(時計仕掛けを使用)があり、どのサブスクリプションが期限切れであるかを確認して、それらを自動的に更新しようとします。ジョブは、次のようにクエリを実行するメソッドを実行します。
where("date(active_until) <= ?", Date.today)
ほとんどの場合、これは正しく実行されます。Date.today
ただし、私のログ観察では、実際の日付と一致しない場合があるようです。私のログから引っ張ってきました:
注:これが正しく実行されるかどうかをテストする時間を手動で設定していたため、日付は未来です。
D, [2016-05-01T00:00:00.015901 #21699] DEBUG -- : Subscription Load (2.6ms) SELECT "subscriptions".* FROM "subscriptions" WHERE date(active_until) <= '2016-04-30'
D, [2016-05-02T00:00:00.011130 #21721] DEBUG -- : Subscription Load (2.2ms) SELECT "subscriptions".* FROM "subscriptions" WHERE date(active_until) <= '2016-05-02'
最初のケースを見ると、2016-05-01T00:00:00.015901
Date.today が生成されている間に、ステートメントが で実行されたことがわかり2016-04-30
ます。ログの日付が Date.today に対応するため、2 番目のケースは明らかに正しいです。
最大の問題は、それを再現できないことです。ログから確認できる唯一のことは、24 回中 3 回発生したことです。ここで何が問題になる可能性がありますか? Railsが入力パラメータをクエリにキャッシュしている可能性はありますか?
私の Ruby バージョンは: ruby 2.2.1p85 (2015-02-26 リビジョン 49769) [x86_64-linux]
私のレールのバージョンは: 4.2.1