Basis data Anda menyimpan stempel waktu Anda di UTC (sebagaimana mestinya). ActiveRecord membuat penyesuaian zona waktu ketika mengetahui bahwa ia memiliki stempel waktu; jadi, ketika Anda mengatakan ini:
puts Activity.first.starting_at
AR tahu bahwa starting_at
adalah stempel waktu sehingga membuat stempel waktu sebagai ActiveSupport::TimeWithZone
instance dan kelas itu menerapkan penyesuaian zona waktu. Tapi, ketika Anda mengatakan ini:
select("date_trunc('day', activities.starting_at) as date ...
AR tidak akan menguraikan SQL untuk mengetahui bahwa date_trunc
akan mengembalikan stempel waktu, AR bahkan tidak tahu apa date_trunc
cara. AR hanya akan melihat string yang keluar dari database dan akan menyerahkannya kepada Anda tanpa interpretasi. Anda bebas memasukkan string itu ke ActiveSupport::TimeWithZone
(atau kelas penanganan waktu favorit Anda) sendiri:tidak ada salahnya memberi tahu AR hal-hal yang tidak dan tidak dapat diketahuinya sendiri.
Rails memang pintar tapi bukan sihir.