ActiveRecord powinien zachować pełną precyzję z bazy danych, po prostu nie patrzysz na nią właściwie. Użyj strftime
i %N
format, aby zobaczyć ułamki sekund. Na przykład psql
mówi to:
=> select created_at from models where id = 1;
created_at
----------------------------
2012-02-07 07:36:20.949641
(1 row)
a ActiveRecord mówi tak:
> Model.find(1).created_at.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-02-07 07:36:20.949641000"
Więc wszystko tam jest, musisz tylko wiedzieć, jak to zobaczyć.
Pamiętaj też, że ActiveRecord prawdopodobnie zapewni Ci ActiveSupport::TimeWithZone
obiekty zamiast DateTime
obiekty, ale DateTime
zachowuje wszystko:
> '2012-12-31T01:01:01.232323+3'.to_datetime.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-12-31 01:01:01.232323000"
Spójrz na connection_adapters/column.rb
w źródle ActiveRecord i sprawdź, co string_to_time
metoda robi. Twój ciąg spadnie poniżej fallback_string_to_time
ścieżka i to zachowuje ułamki sekund tak blisko, jak mogę to powiedzieć. Coś dziwnego może dziać się gdzie indziej, nie byłbym zaskoczony, biorąc pod uwagę dziwne rzeczy, które widziałem w źródle Rails, zwłaszcza po stronie bazy danych. Spróbowałbym przekonwertować ciągi na obiekty ręcznie, aby ActiveRecord trzymał je z daleka.