データベースはタイムスタンプを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は賢いですが、魔法ではありません。