Din databas lagrar dina tidsstämplar i UTC (som den ska). ActiveRecord gör tidszonsjusteringar när det vet att det har en tidsstämpel; så när du säger detta:
puts Activity.first.starting_at
AR vet att starting_at
är en tidsstämpel så den instansierar tidsstämpeln som en ActiveSupport::TimeWithZone
instans och den klassen tillämpar tidszonsjusteringen. Men när du säger detta:
select("date_trunc('day', activities.starting_at) as date ...
AR kommer inte att analysera SQL för att ta reda på den date_trunc
returnerar en tidsstämpel, AR vet inte ens vad date_trunc
betyder att. AR kommer bara att se en sträng som kommer ut från databasen och den kommer att lämna den till dig utan tolkning. Du är fri att mata den strängen till ActiveSupport::TimeWithZone
(eller din favorittimehanteringsklass) själv:det är inget fel med att berätta saker för AR som den inte kan och inte kan veta på egen hand.
Rails är smart men det är inte magi.