PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Rails ne convertit pas le fuseau horaire (PostgreSQL)

Votre base de données stocke vos horodatages en UTC (comme il se doit). ActiveRecord effectue des ajustements de fuseau horaire lorsqu'il sait qu'il a un horodatage ; donc, quand tu dis ceci :

puts Activity.first.starting_at

AR sait que starting_at est un horodatage donc il instancie l'horodatage comme un ActiveSupport::TimeWithZone instance et cette classe applique l'ajustement de fuseau horaire. Mais, quand vous dites ceci :

select("date_trunc('day', activities.starting_at) as date ...

AR ne va pas analyser le SQL pour comprendre que date_trunc renverra un horodatage, AR ne sait même pas ce que date_trunc moyens. AR verra simplement une chaîne sortir de la base de données et vous la remettra sans interprétation. Vous êtes libre de transmettre cette chaîne à ActiveSupport::TimeWithZone (ou votre classe de gestion du temps préférée) vous-même :il n'y a rien de mal à dire à la réalité augmentée des choses qu'elle ne sait pas et ne peut pas savoir par elle-même.

Rails est intelligent mais ce n'est pas magique.