Votre base de données stocke vos horodatages en UTC (comme il se doit). ActiveRecord effectue des ajustements de fuseau horaire lorsqu'il sait qu'il a un horodatage ; donc, quand tu dis ceci :
puts Activity.first.starting_at
AR sait que starting_at
est un horodatage donc il instancie l'horodatage comme un ActiveSupport::TimeWithZone
instance et cette classe applique l'ajustement de fuseau horaire. Mais, quand vous dites ceci :
select("date_trunc('day', activities.starting_at) as date ...
AR ne va pas analyser le SQL pour comprendre que date_trunc
renverra un horodatage, AR ne sait même pas ce que date_trunc
moyens. AR verra simplement une chaîne sortir de la base de données et vous la remettra sans interprétation. Vous êtes libre de transmettre cette chaîne à ActiveSupport::TimeWithZone
(ou votre classe de gestion du temps préférée) vous-même :il n'y a rien de mal à dire à la réalité augmentée des choses qu'elle ne sait pas et ne peut pas savoir par elle-même.
Rails est intelligent mais ce n'est pas magique.