Uw database slaat uw tijdstempels op in UTC (zoals het hoort). ActiveRecord maakt tijdzone-aanpassingen wanneer het weet dat het een tijdstempel heeft; dus, als je dit zegt:
puts Activity.first.starting_at
AR weet dat starting_at
is een tijdstempel, dus het maakt de tijdstempel als een ActiveSupport::TimeWithZone
instantie en die klasse past de tijdzone-aanpassing toe. Maar als je dit zegt:
select("date_trunc('day', activities.starting_at) as date ...
AR gaat de SQL niet ontleden om erachter te komen dat date_trunc
zal een tijdstempel retourneren, AR weet niet eens wat date_trunc
middelen. AR ziet gewoon een string uit de database komen en zal deze zonder interpretatie aan u overhandigen. U bent vrij om die string door te voeren naar ActiveSupport::TimeWithZone
(of je favoriete les voor tijdafhandeling) zelf:er is niets mis mee om AR dingen te vertellen die het zelf niet weet en niet kan weten.
Rails is slim, maar het is geen magie.