Løsning i Rails-siden
Det ser ud til, at ActiveRecord brugt i Rails (5.2) automatisk tilføjer decimalsekunder ned til 1 msek ved at gemme created_at
og updated_at
eller andre tidsstempelkolonner i databasen, der accepterer undersekunder, som defineret i filen active_record/connection_adapters/abstract/quoting.rb
Et arbejde rundt er dette. Tilføj denne linje på et øverste niveau i en hvilken som helst af de filer, som altid ville blive læst af Rails, når du får adgang til en model (såsom ApplicationRecord modelfil).
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
Du kan bekræfte det fra Rails-konsollen, efter at du har oprettet en ny post,
MyModel.last.created_at.nsec # => 0
eller bare få adgang til DB direkte for at se den.
Advarsel
Denne ændring påvirker ikke kun created_at
og updated_at
men også alle de andre tidsstempelkolonner i DB. Jeg tror, du stadig kan gemme en værdi til msec (eller nsec) præcision til en sådan kolonne ved at indstille en streng i modsætning til en Time-forekomst til din modelforekomst som my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; derefter Time::DATE_FORMATS[:db]
ville ikke blive refereret til ved lagring af posten.
Potentiel opløsning i Laravel-siden
Det kan være vanskeligt i skrivende stund (2018-10-18), men et arbejde ser ud til at være i gang, ifølge en meget nyligt Laracast-indlæg af cmbertsch01
(Bemærk:en større opdatering lavet dagen efter fra det originale indlæg efter kommentaren.)