Su base de datos está almacenando sus marcas de tiempo en UTC (como debería). ActiveRecord realiza ajustes de zona horaria cuando sabe que tiene una marca de tiempo; entonces, cuando dices esto:
puts Activity.first.starting_at
AR sabe que starting_at
es una marca de tiempo, por lo que instancia la marca de tiempo como un ActiveSupport::TimeWithZone
instancia y esa clase aplica el ajuste de zona horaria. Pero, cuando dices esto:
select("date_trunc('day', activities.starting_at) as date ...
AR no analizará el SQL para descubrir que date_trunc
devolverá una marca de tiempo, AR ni siquiera sabe qué date_trunc
medio. AR solo verá una cadena que sale de la base de datos y se la entregará sin interpretación. Puede enviar esa cadena a ActiveSupport::TimeWithZone
(o su clase favorita de manejo del tiempo) usted mismo:no hay nada de malo en decirle cosas a AR que no sabe y no puede saber por sí mismo.
Rails es inteligente pero no es magia.