PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe uma maneira de alterar os timestamps padrão do Rails para Y-m-d H:i:s (em vez de Y-m-d H:i:s.u) ou fazer com que o laravel ignore a parte decimal de Y-m-d H:i:s.u?

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.)