ActiveRecord harus mempertahankan presisi penuh dari database, Anda hanya tidak melihatnya dengan benar. Gunakan strftime
dan %N
format untuk melihat pecahan detik. Misalnya, psql
mengatakan ini:
=> select created_at from models where id = 1;
created_at
----------------------------
2012-02-07 07:36:20.949641
(1 row)
dan ActiveRecord mengatakan ini:
> Model.find(1).created_at.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-02-07 07:36:20.949641000"
Jadi semuanya ada di sana, Anda hanya perlu tahu cara melihatnya.
Perhatikan juga bahwa ActiveRecord mungkin akan memberi Anda ActiveSupport::TimeWithZone
objek daripada DateTime
objek tetapi DateTime
mempertahankan semuanya juga:
> '2012-12-31T01:01:01.232323+3'.to_datetime.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-12-31 01:01:01.232323000"
Lihat connection_adapters/column.rb
di sumber ActiveRecord dan periksa apa string_to_time
metode tidak. String Anda akan turun fallback_string_to_time
path dan itu mempertahankan pecahan detik sedekat yang saya tahu. Sesuatu yang aneh bisa terjadi di tempat lain, saya tidak akan terkejut mengingat hal-hal aneh yang saya lihat di sumber Rails, terutama sisi database. Saya akan mencoba mengonversi string menjadi objek dengan tangan sehingga ActiveRecord akan menjauhkannya dari mereka.