Din database gemmer dine tidsstempler i UTC (som den skal). ActiveRecord laver tidszonejusteringer, når det ved, at det har et tidsstempel; så når du siger dette:
puts Activity.first.starting_at
AR ved, at starting_at
er et tidsstempel, så det instansierer tidsstemplet som en ActiveSupport::TimeWithZone
instans, og den klasse anvender tidszonejusteringen. Men når du siger dette:
select("date_trunc('day', activities.starting_at) as date ...
AR vil ikke analysere SQL'en for at finde ud af den date_trunc
returnerer et tidsstempel, AR ved ikke engang hvad date_trunc
midler. AR vil bare se en streng komme ud af databasen, og den vil give dig den uden fortolkning. Du kan frit fodre denne streng til ActiveSupport::TimeWithZone
(eller din foretrukne timehåndteringstime) dig selv:Der er intet galt i at fortælle AR ting, som den ikke ved og ikke kan vide af sig selv.
Rails er smart, men det er ikke magi.