Seu banco de dados está armazenando seus timestamps em UTC (como deveria). ActiveRecord está fazendo ajustes de fuso horário quando sabe que tem um timestamp; então, quando você diz isso:
puts Activity.first.starting_at
AR sabe que
starting_at
é um carimbo de data/hora, portanto, instancia o carimbo de data/hora como um ActiveSupport::TimeWithZone
instância e essa classe aplica o ajuste de fuso horário. Mas, quando você diz isso:select("date_trunc('day', activities.starting_at) as date ...
AR não vai analisar o SQL para descobrir que
date_trunc
retornará um timestamp, AR nem sabe o que date_trunc
significa. AR apenas verá uma string saindo do banco de dados e a entregará a você sem interpretação. Você está livre para alimentar essa string para ActiveSupport::TimeWithZone
(ou sua aula favorita de gerenciamento de tempo) você mesmo:não há nada de errado em dizer coisas de RA que ele não sabe e não pode saber por conta própria. Rails é inteligente, mas não é mágico.