Решение в страната на Rails
Изглежда, че ActiveRecord, използван в Rails (5.2), автоматично добавя десетични секунди до 1 msec при запазване на created_at
и updated_at
или всякакви други колони с клеймо за време в DB, които приемат подсекунди, както е дефинирано във файла active_record/connection_adapters/abstract/quoting.rb
Заобикалянето е това. Добавете този ред на най-високо ниво във всеки от файловете, които винаги ще се четат от Rails при достъп до модел (като файл с модел ApplicationRecord).
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
Можете да го потвърдите от конзолата на Rails, след като създадете нов запис,
MyModel.last.created_at.nsec # => 0
или просто влезте директно в базата данни, за да я видите.
Предупреждение
Тази промяна засяга не само created_at
и updated_at
но също и всички други колони с клеймо за време в DB. Мисля, че все още можете да запазите стойност за точност на msec (или nsec) в такава колона, като зададете String вместо екземпляр Time на вашия модел на екземпляр като my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; след това Time::DATE_FORMATS[:db]
няма да бъдат посочени при запазване на записа.
Потенциално решение от страна на Laravel
Може да е трудно към момента на писане (2018-10-18), но работата изглежда е в ход, според съвсем скорошна публикация на Laracast от cmbertsch01
(Забележка:голяма актуализация, направена ден след първоначалната публикация, след коментара.)