ActiveRecord nên bảo toàn độ chính xác đầy đủ từ cơ sở dữ liệu, chỉ là bạn không xem xét nó đúng cách. Sử dụng strftime
và %N
định dạng để xem giây phân số. Ví dụ:psql
nói thế này:
=> select created_at from models where id = 1;
created_at
----------------------------
2012-02-07 07:36:20.949641
(1 row)
và ActiveRecord cho biết điều này:
> Model.find(1).created_at.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-02-07 07:36:20.949641000"
Vì vậy, mọi thứ đều ở đó, bạn chỉ cần biết cách để xem nó.
Cũng lưu ý rằng ActiveRecord có thể sẽ cung cấp cho bạn ActiveSupport::TimeWithZone
các đối tượng thay vì DateTime
các đối tượng trừ DateTime
bảo quản mọi thứ nữa:
> '2012-12-31T01:01:01.232323+3'.to_datetime.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-12-31 01:01:01.232323000"
Hãy xem connection_adapters/column.rb
trong nguồn ActiveRecord và kiểm tra xem string_to_time
nào phương pháp nào. Chuỗi của bạn sẽ đi xuống fallback_string_to_time
và điều đó bảo toàn số giây phân số gần như tôi có thể biết. Một điều gì đó kỳ lạ có thể đang xảy ra ở nơi khác, tôi sẽ không ngạc nhiên khi biết những điều kỳ lạ mà tôi đã thấy trong nguồn Rails, đặc biệt là phía cơ sở dữ liệu của mọi thứ. Tôi sẽ thử chuyển đổi các chuỗi thành các đối tượng bằng tay để ActiveRecord tránh xa chúng.