PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es eine Möglichkeit, die Standardzeitstempel von Rails in Y-m-d H:i:s (anstelle von Y-m-d H:i:s.u) zu ändern oder Laravel den Dezimalteil von Y-m-d H:i:s.u ignorieren zu lassen?

Lösung auf der Rails-Seite

Es scheint, dass ActiveRecord, das in Rails (5.2) verwendet wird, beim Speichern von created_at automatisch Dezimalsekunden auf 1 ms hinzufügt und updated_at oder andere Timestamp-Spalten in der DB, die Sekundenbruchteile akzeptieren, wie in der Datei active_record/connection_adapters/abstract/quoting.rb definiert

Eine Umgehung ist dies. Fügen Sie diese Zeile auf oberster Ebene in einer der Dateien hinzu, die immer von Rails gelesen werden, wenn auf ein Modell zugegriffen wird (z. B. ApplicationRecord-Modelldatei).

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

Sie können dies von der Rails-Konsole aus bestätigen, nachdem Sie einen neuen Datensatz erstellt haben,

MyModel.last.created_at.nsec  # => 0

oder greifen Sie einfach direkt auf die Datenbank zu, um sie anzuzeigen.

Warnung

Diese Änderung betrifft nicht nur created_at und updated_at sondern auch alle anderen Timestamp-Spalten in der DB. Ich denke, Sie können in einer solchen Spalte immer noch einen Wert mit einer Genauigkeit von ms (oder ns) speichern, indem Sie eine Zeichenfolge anstelle einer Zeitinstanz für Ihre Modellinstanz wie my_model.col_msec_desired = "2018-01-02 03:04:05.678"; dann Time::DATE_FORMATS[:db] würde beim Speichern des Datensatzes nicht referenziert.

Mögliche Lösung auf der Laravel-Seite

Es mag zum Zeitpunkt des Schreibens (2018-10-18) schwierig sein, aber laut einem sehr aktueller Laracast-Beitrag von cmbertsch01

(Anmerkung:eine größere Aktualisierung, die einen Tag nach dem ursprünglichen Beitrag nach dem Kommentar vorgenommen wurde.)