Vaše databáze ukládá vaše časová razítka v UTC (jak by měla). ActiveRecord provádí úpravy časového pásma, když ví, že má časové razítko; takže, když říkáte toto:
puts Activity.first.starting_at
AR ví, že starting_at
je časové razítko, takže vytváří instanci časového razítka jako ActiveSupport::TimeWithZone
instance a tato třída použije úpravu časového pásma. Ale když říkáte toto:
select("date_trunc('day', activities.starting_at) as date ...
AR nebude analyzovat SQL, aby zjistil, že date_trunc
vrátí časové razítko, AR ani neví, co date_trunc
prostředek. AR pouze uvidí řetězec vycházející z databáze a předá vám jej bez interpretace. Tento řetězec můžete volně vložit do ActiveSupport::TimeWithZone
(nebo vaše oblíbená hodina řízení času) sami:není nic špatného na tom, když AR řeknete věci, které sama o sobě neví a nemůže vědět.
Rails je chytrý, ale není to kouzlo.