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

Existe-t-il un moyen de changer les horodatages par défaut de Rails en Y-m-d H:i:s (au lieu de Y-m-d H:i:s.u) ou de faire en sorte que laravel ignore la partie décimale de Y-m-d H:i:s.u ?

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.)