Solusi di sisi Rel
Tampaknya ActiveRecord yang digunakan di Rails (5.2) secara otomatis menambahkan detik desimal ke 1 msec dalam menyimpan created_at
dan updated_at
atau kolom Timestamp lain dalam DB yang menerima sub-detik, seperti yang didefinisikan dalam file active_record/connection_adapters/abstract/quoting.rb
Sebuah pekerjaan di sekitar adalah ini. Tambahkan baris ini di tingkat atas di salah satu file yang akan selalu dibaca oleh Rails saat mengakses model (seperti, file model 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
Anda dapat mengonfirmasinya dari konsol Rails, setelah membuat catatan baru,
MyModel.last.created_at.nsec # => 0
atau cukup akses DB secara langsung untuk melihatnya.
Peringatan
Perubahan ini tidak hanya memengaruhi created_at
dan updated_at
tetapi juga semua kolom cap waktu lainnya di DB. Saya pikir Anda masih dapat menyimpan nilai ke presisi msec (atau nsec) ke kolom seperti itu dengan menetapkan String sebagai lawan dari instance Time ke instance Model Anda seperti my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; lalu Time::DATE_FORMATS[:db]
tidak akan dirujuk dalam menyimpan catatan.
Solusi potensial di sisi Laravel
Ini mungkin rumit pada saat penulisan (2018-10-18), tetapi pekerjaan tampaknya sedang berlangsung, menurut postingan Laracast terbaru oleh cmbertsch01
(Catatan:pembaruan besar dilakukan sehari setelahnya dari pos asli, mengikuti komentar.)