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