データベースはタイムスタンプをUTCで保存しています(必要に応じて)。 ActiveRecordは、タイムスタンプがあることがわかっているときにタイムゾーンを調整しています。だから、あなたがこれを言うとき:
puts Activity.first.starting_at
ARはstarting_at
を知っています はタイムスタンプであるため、タイムスタンプを ActiveSupport::TimeWithZone
としてインスタンス化します。
インスタンスとそのクラスはタイムゾーン調整を適用します。しかし、あなたがこれを言うとき:
select("date_trunc('day', activities.starting_at) as date ...
ARは、SQLを解析してdate_trunc
を把握することはありません。 タイムスタンプを返します。ARはdate_trunc
が何であるかさえ知りません。 意味。 ARはデータベースから文字列が出てくるのを見るだけで、解釈せずにそれをあなたに渡します。その文字列をActiveSupport::TimeWithZone
に自由にフィードできます (またはあなたの好きな時間処理クラス)あなた自身:ARに、それ自体ではわからないことやわからないことを伝えることに何の問題もありません。
Railsは賢いですが、魔法ではありません。