Twoja baza danych przechowuje Twoje znaczniki czasu w UTC (tak jak powinno). ActiveRecord dokonuje korekt strefy czasowej, gdy wie, że ma znacznik czasu; więc kiedy to powiesz:
puts Activity.first.starting_at
AR wie, że starting_at
jest znacznikiem czasu, więc tworzy wystąpienie znacznika czasu jako ActiveSupport::TimeWithZone
wystąpienie i ta klasa zastosuje korektę strefy czasowej. Ale kiedy to powiesz:
select("date_trunc('day', activities.starting_at) as date ...
AR nie będzie analizować kodu SQL, aby dowiedzieć się, że date_trunc
zwróci znacznik czasu, AR nawet nie wie, co date_trunc
oznacza. AR po prostu zobaczy ciąg wychodzący z bazy danych i przekaże go bez interpretacji. Możesz przesłać ten ciąg do ActiveSupport::TimeWithZone
(lub twoją ulubioną klasę zarządzania czasem):nie ma nic złego w mówieniu AR rzeczy, których sam nie wie i nie może wiedzieć.
Railsy są sprytne, ale nie magiczne.