Oplossing aan de kant van de rails
Het lijkt erop dat ActiveRecord gebruikt in Rails (5.2) automatisch decimale seconden toevoegt tot 1 msec bij het opslaan van created_at
en updated_at
of andere Timestamp-kolommen in de DB die subseconden accepteren, zoals gedefinieerd in het bestand active_record/connection_adapters/abstract/quoting.rb
Een work-around is dit. Voeg deze regel toe op het hoogste niveau in een van de bestanden die altijd door Rails zouden worden gelezen bij toegang tot een model (zoals een ApplicationRecord-modelbestand).
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
Je kunt het bevestigen vanaf de Rails-console, nadat je een nieuw record hebt gemaakt,
MyModel.last.created_at.nsec # => 0
of ga gewoon rechtstreeks naar de database om deze te bekijken.
Waarschuwing
Deze wijziging is niet alleen van invloed op created_at
en updated_at
maar ook alle andere tijdstempelkolommen in de DB. Ik denk dat je nog steeds een waarde voor msec (of nsec) precisie in een dergelijke kolom kunt opslaan door een String in te stellen in plaats van een Time-instantie voor je Model-instantie zoals my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; dan Time::DATE_FORMATS[:db]
zou niet worden vermeld bij het opslaan van het record.
Potentiële oplossing in de Laravel-kant
Het is misschien lastig op het moment van schrijven (2018-10-18), maar er lijkt een werk aan de gang te zijn, volgens een zeer recent Laracast-bericht door cmbertsch01
(Opmerking:een dag later is er een grote update gemaakt van het oorspronkelijke bericht, na de opmerking.)