Вашата база данни съхранява вашите времеви марки в UTC (както трябва). ActiveRecord прави корекции на часовата зона, когато знае, че има клеймо за време; така че, когато кажете това:
puts Activity.first.starting_at
AR знае това starting_at
е клеймо за време, така че инстанцира клеймото за време като ActiveSupport::TimeWithZone
екземпляр и този клас прилага корекцията на часовата зона. Но когато кажете това:
select("date_trunc('day', activities.starting_at) as date ...
AR няма да анализира SQL, за да разбере, че date_trunc
ще върне клеймо за време, AR дори не знае какво е date_trunc
означава. AR просто ще види низ, излизащ от базата данни, и ще ви го предаде без интерпретация. Вие сте свободни да подадете този низ към ActiveSupport::TimeWithZone
(или любимия ви клас за обработка на времето) себе си:няма нищо лошо в това да кажете на AR неща, които той не знае и не може да знае сам.
Rails е умен, но не е магия.