1

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.015901Date.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

4

2 に答える 2

0

config/application.rbファイルで、タイムゾーンがテストしている実際のタイムゾーンに設定されていることを確認してください。

PST の場合、以下を使用します。

config.time_zone = 'Pacific Time (US & Canada)'

Rails で使用できるタイムゾーン文字列のリストを取得するには、次のコマンドを実行します。

rake time:zones:all

より具体的なロケールを指定することもできます。米国の場合:

rake time:zones:us

于 2016-02-02T21:06:02.793 に答える
-1

これは真夜中頃に発生するため、エントリを生成するスクリプトが実行された直後にログ ファイルが更新されるのは、タイミングの問題であると考えられます。ログ機能はログ エントリを送信するスクリプトとは別であるため、負荷に関連している可能性があります。

于 2016-02-02T21:15:15.343 に答える