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

Résolution en millisecondes de DateTime dans Ruby

ActiveRecord devrait conserver toute la précision de la base de données, vous ne la regardez pas correctement. Utilisez strftime et le %N format pour voir les fractions de secondes. Par exemple, psql dit ceci :

=> select created_at from models where id = 1;
         created_at         
----------------------------
 2012-02-07 07:36:20.949641
(1 row)

et ActiveRecord dit ceci :

> Model.find(1).created_at.strftime('%Y-%m-%d %H:%M:%S.%N')
 => "2012-02-07 07:36:20.949641000" 

Alors tout y est, il suffit de savoir comment le voir.

Notez également qu'ActiveRecord vous donnera probablement ActiveSupport::TimeWithZone objets plutôt que DateTime objets mais DateTime conserve tout aussi :

> '2012-12-31T01:01:01.232323+3'.to_datetime.strftime('%Y-%m-%d %H:%M:%S.%N')
 => "2012-12-31 01:01:01.232323000" 

Jetez un œil à connection_adapters/column.rb dans la source ActiveRecord et vérifiez ce que le string_to_time méthode le fait. Votre chaîne descendrait le fallback_string_to_time chemin et qui préserve les fractions de seconde aussi près que je sache. Quelque chose d'étrange pourrait se passer ailleurs, je ne serais pas surpris étant donné les choses étranges que j'ai vues dans la source Rails, en particulier du côté de la base de données. J'essaierais de convertir les chaînes en objets à la main afin qu'ActiveRecord ne les touche pas.