sql >> Database >  >> RDS >> PostgreSQL

Is er een manier om de standaard tijdstempels van Rails te wijzigen in Y-m-d H:i:s (in plaats van Y-m-d H:i:s.u) of om laravel het decimale gedeelte van Y-m-d H:i:s.u te laten negeren?

Oplossing aan de kant van de rails

Het lijkt erop dat ActiveRecord gebruikt in Rails (5.2) automatisch decimale seconden toevoegt tot 1 msec bij het opslaan van created_at en updated_at of andere Timestamp-kolommen in de DB die subseconden accepteren, zoals gedefinieerd in het bestand active_record/connection_adapters/abstract/quoting.rb

Een work-around is dit. Voeg deze regel toe op het hoogste niveau in een van de bestanden die altijd door Rails zouden worden gelezen bij toegang tot een model (zoals een ApplicationRecord-modelbestand).

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

Je kunt het bevestigen vanaf de Rails-console, nadat je een nieuw record hebt gemaakt,

MyModel.last.created_at.nsec  # => 0

of ga gewoon rechtstreeks naar de database om deze te bekijken.

Waarschuwing

Deze wijziging is niet alleen van invloed op created_at en updated_at maar ook alle andere tijdstempelkolommen in de DB. Ik denk dat je nog steeds een waarde voor msec (of nsec) precisie in een dergelijke kolom kunt opslaan door een String in te stellen in plaats van een Time-instantie voor je Model-instantie zoals my_model.col_msec_desired = "2018-01-02 03:04:05.678"; dan Time::DATE_FORMATS[:db] zou niet worden vermeld bij het opslaan van het record.

Potentiële oplossing in de Laravel-kant

Het is misschien lastig op het moment van schrijven (2018-10-18), maar er lijkt een werk aan de gang te zijn, volgens een zeer recent Laracast-bericht door cmbertsch01

(Opmerking:een dag later is er een grote update gemaakt van het oorspronkelijke bericht, na de opmerking.)



  1. Mysql-bulkupdate

  2. Wat is de beste manier om een ​​rollup-tabel onder belasting te vernieuwen?

  3. Start mysql opnieuw op in de php-browser, probleem met machtigingen?

  4. Anonimiseer uw abonnementsgegevens in Plan Explorer