Решение на стороне Rails
Кажется, что ActiveRecord, используемый в Rails (5.2), автоматически добавляет десятичные секунды до 1 мс при сохранении created_at
и updated_at
или любых других столбцов меток времени в БД, которые принимаютсекунды, как определено в файле 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
, нотакже все остальные столбцы меток времени в БД.Я думаю, что вы все еще можете сохранить значение с точностью до мсек (или нсек) для такого столбца, установив строку в отличие от экземпляра Time для экземпляра модели, например my_model.col_msec_desired = "2018-01-02 03:04:05.678"
;тогда Time::DATE_FORMATS[:db]
не будет использоваться для сохранения записи.
Потенциальное решение на стороне Laravel
Это может быть сложно на момент написания (2018-10-18), ноПохоже, что работа продолжается, согласно очень недавнему сообщению Laracast от cmbertsch01
(Примечание: крупное обновление было сделано через день после исходного сообщения после комментария.)