Lösning på Rails-sidan
Det verkar som att ActiveRecord som används i Rails (5.2) automatiskt lägger till decimalsekunder ner till 1 msek för att spara created_at
och updated_at
eller någon annan tidsstämpelkolumn i databasen som accepterar undersekunder, enligt definitionen i filen active_record/connection_adapters/abstract/quoting.rb
Ett arbete runt är detta. Lägg till den här raden på en översta nivå i någon av filerna som alltid skulle läsas av Rails när du kommer åt en modell (t.ex. ApplicationRecord-modellfilen).
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äfta det från Rails-konsolen efter att ha skapat en ny post,
MyModel.last.created_at.nsec # => 0
eller gå helt enkelt till DB direkt för att se den.
Varning
Denna ändring påverkar inte bara created_at
och updated_at
men även alla andra tidsstämpelkolumner i DB. Jag tror att du fortfarande kan spara ett värde till msec (eller nsec) precision till en sådan kolumn genom att ställa in en String i motsats till en Time-instans till din Model-instans som my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; sedan Time::DATE_FORMATS[:db]
skulle inte refereras till när posten sparades.
Potentiell lösning på Laravel-sidan
Det kan vara knepigt i skrivande stund (2018-10-18), men ett arbete verkar vara på gång, enligt en mycket nyligen Laracast-inlägg av cmbertsch01
(Obs:en stor uppdatering gjordes en dag efter från det ursprungliga inlägget, efter kommentaren.)