0

セットアップは次のとおりです。

end_date = DateTime.parse('2010-01-01 12:00:00-04')

そして時々初期化されます:

end_date = 1.days.ago

質問...これらのnamed_scopeは同じ正確なSQLを生成しますか?

named_scope :before, lambda { |end_date| 
     { :conditions => 
            ["overdraft_transaction_payments.created_at < ?", end_date] } 
}

named_scope :before, lambda { |end_date| 
     { :conditions => 
            ["overdraft_transaction_payments.created_at < ?", end_date.utc] } 
}

最初の例では end_date を使用し、2 番目の例では end_date.utc を使用しています。

(注意が必要かもしれません.... DBサーバーのOSはCDTに設定されており、DBは内部的にUTCを使用しています.RailsサーバーのOSはCDTに設定されており、アプリケーションインスタンスはEDTに設定されています.これはおそらくこれらのシステムを構成する最適な方法ではありませんが、当面の問題は ActiveRecord 出力です。)

私の直感では、最初の例ではローカル TZ の時刻文字列が生成され、2 番目の例では UTC-0 が生成されます。

PS: 私の直感を検証するために使用できるミニ テスト ケースはありますか?

4

1 に答える 1

1

内部では、".to_s(:db)" の呼び出しで日付が変換されると思います。IRB コンソール セッションで、それが何を返すかを確認できます。

>> DateTime.parse('2010-01-01 12:00:00-04').to_s(:db)
=> "2010-01-01 12:00:00"
>> DateTime.parse('2010-01-01 12:00:00-04').utc.to_s(:db)
=> "2010-01-01 16:00:00"
>> 1.days.ago.to_s(:db)
=> "2010-08-12 18:01:09"
>> 1.days.ago.utc.to_s(:db)
=> "2010-08-12 18:01:13"
于 2010-08-13T18:03:08.720 に答える