Ihre Datenbank speichert Ihre Zeitstempel in UTC (so wie es sein sollte). ActiveRecord nimmt Zeitzonenanpassungen vor, wenn es weiß, dass es einen Zeitstempel hat; also, wenn du das sagst:
puts Activity.first.starting_at
AR weiß, dass starting_at
ist ein Zeitstempel, also instanziiert er den Zeitstempel als ActiveSupport::TimeWithZone
-Instanz und diese Klasse wendet die Zeitzonenanpassung an. Aber wenn Sie das sagen:
select("date_trunc('day', activities.starting_at) as date ...
AR wird das SQL nicht parsen, um dieses date_trunc
herauszufinden einen Zeitstempel zurückgeben, AR weiß nicht einmal, was date_trunc
ist meint. AR sieht nur eine Zeichenfolge aus der Datenbank und gibt sie Ihnen ohne Interpretation weiter. Es steht Ihnen frei, diese Zeichenfolge an ActiveSupport::TimeWithZone
weiterzugeben (oder Ihre Lieblings-Zeitmanagement-Klasse) selbst:Es ist nichts falsch daran, AR Dinge zu sagen, die es selbst nicht weiß und nicht wissen kann.
Rails ist schlau, aber keine Zauberei.