Solution côté Rails
Il semble qu'ActiveRecord utilisé dans Rails (5.2) ajoute automatiquement des secondes décimales jusqu'à 1 msec lors de l'enregistrement de created_at
et updated_at
ou toute autre colonne d'horodatage dans la base de données qui accepte les sous-secondes, comme défini dans le fichier active_record/connection_adapters/abstract/quoting.rb
Un travail autour est ceci. Ajoutez cette ligne à un niveau supérieur dans l'un des fichiers qui seraient toujours lus par Rails lors de l'accès à un modèle (tel que le fichier de modèle ApplicationRecord).
Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'
module ActiveRecord::ConnectionAdapters::Quoting
alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)
def quoted_date(*rest, **kwd)
quoted = quoted_date_orig(*rest, **kwd)
quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
end
end
Vous pouvez le confirmer depuis la console Rails, après avoir créé un nouvel enregistrement,
MyModel.last.created_at.nsec # => 0
ou simplement accéder directement à la BD pour la voir.
Avertissement
Ce changement affecte non seulement created_at
et updated_at
mais aussi toutes les autres colonnes d'horodatage de la BD. Je pense que vous pouvez toujours enregistrer une valeur avec une précision msec (ou nsec) dans une telle colonne en définissant une chaîne par opposition à une instance Time sur votre instance Model comme my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; puis Time::DATE_FORMATS[:db]
ne serait pas référencé lors de la sauvegarde de l'enregistrement.
Solution potentielle du côté de Laravel
C'est peut-être délicat au moment de la rédaction (2018-10-18), mais un travail semble être en cours, selon un message très récent sur Laracast par cmbertsch01
(Remarque :une mise à jour majeure effectuée le lendemain du message d'origine, suite au commentaire.)