ActiveRecord deve preservar a precisão total do banco de dados, você simplesmente não está olhando para ele corretamente. Use
strftime
e o %N
formato para ver os segundos fracionários. Por exemplo, psql
diz isso:=> select created_at from models where id = 1;
created_at
----------------------------
2012-02-07 07:36:20.949641
(1 row)
e ActiveRecord diz isso:
> Model.find(1).created_at.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-02-07 07:36:20.949641000"
Então tudo está lá, você só precisa saber como vê-lo.
Observe também que o ActiveRecord provavelmente fornecerá
ActiveSupport::TimeWithZone
objetos em vez de DateTime
objetos, mas DateTime
preserva tudo também:> '2012-12-31T01:01:01.232323+3'.to_datetime.strftime('%Y-%m-%d %H:%M:%S.%N')
=> "2012-12-31 01:01:01.232323000"
Dê uma olhada em
connection_adapters/column.rb
na fonte ActiveRecord e verifique o que o string_to_time
método faz. Sua string desceria o fallback_string_to_time
path e que preserva os segundos fracionários o mais próximo que posso dizer. Algo estranho pode estar acontecendo em outro lugar, eu não ficaria surpreso com as coisas estranhas que vi na fonte do Rails, especialmente o lado do banco de dados. Eu tentaria converter as strings em objetos manualmente para que o ActiveRecord mantenha suas mãos longe delas.