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.