Il tuo database sta memorizzando i tuoi timestamp in UTC (come dovrebbe). ActiveRecord sta apportando modifiche al fuso orario quando sa di avere un timestamp; quindi, quando dici questo:
puts Activity.first.starting_at
AR sa che starting_at
è un timestamp, quindi crea un'istanza del timestamp come ActiveSupport::TimeWithZone
istanza e quella classe applica la regolazione del fuso orario. Ma, quando dici questo:
select("date_trunc('day', activities.starting_at) as date ...
AR non analizzerà l'SQL per capire quel date_trunc
restituirà un timestamp, AR non sa nemmeno cosa date_trunc
significa. AR vedrà solo una stringa uscire dal database e te la consegnerà senza interpretazione. Sei libero di inviare quella stringa a ActiveSupport::TimeWithZone
(o la tua lezione di gestione del tempo preferita) te stesso:non c'è niente di sbagliato nel dire ad AR cose che non sa e non può sapere da solo.
Rails è intelligente ma non è magico.