Solução no lado Rails
Parece que o ActiveRecord usado no Rails (5.2) adiciona automaticamente segundos decimais até 1 ms ao salvar
created_at
e updated_at
ou qualquer outra coluna de carimbo de data/hora no banco de dados que aceite subsegundos, conforme definido no arquivo active_record/connection_adapters/abstract/quoting.rb
Um trabalho em torno é isso. Adicione esta linha em um nível superior em qualquer um dos arquivos que sempre seriam lidos pelo Rails ao acessar um modelo (como o arquivo de modelo ApplicationRecord).
Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'
module ActiveRecord::ConnectionAdapters::Quoting
alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)
def quoted_date(*rest, **kwd)
quoted = quoted_date_orig(*rest, **kwd)
quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
end
end
Você pode confirmar no console do Rails, após criar um novo registro,
MyModel.last.created_at.nsec # => 0
ou simplesmente acesse o banco de dados diretamente para vê-lo.
Aviso
Essa mudança afeta não apenas
created_at
e updated_at
mas também todas as outras colunas de carimbo de data/hora no banco de dados. Eu acho que você ainda pode salvar um valor de precisão msec (ou nsec) para essa coluna definindo uma String em oposição a uma instância de Time para sua instância de modelo como my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; então Time::DATE_FORMATS[:db]
não seria referenciado ao salvar o registro. Solução potencial no lado do Laravel
Pode ser complicado no momento em que escrevo (2018-10-18), mas um trabalho parece estar em andamento, de acordo com um postagem muito recente do Laracast por cmbertsch01
(Nota:uma grande atualização feita um dia depois da postagem original, após o comentário.)