sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan indstiller jeg i en Rails-migrering standardværdien for en kolonne til at være NOW() i stedet for det tidspunkt, hvor jeg kørte migreringen?

Det er ikke veldokumenteret, men du kan levere en lambda som standardværdi i en migrering, og det vil gøre det rigtige. Hvis du siger dette:

def change
  change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end

så vil kolonnens standardværdi blive sat til now() og databasefunktionen now() kaldes ikke før en standardværdi er nødvendig for kolonnen. Så hvis du \d stratum_worker_submissions i psql du vil se:

created_at | timestamp without time zone | not null default now()

som ønsket. Enhver anden standard vil blive evalueret, når migreringen kører, og du ender med et fast tidsstempel som standard.

Alternativt kan du altid gøre det i hånden ved hjælp af SQL:

def up
  connection.execute(%q(
    alter table stratum_worker_submissions
    alter column created_at
    set default now()
  ))
end
def down
  connection.execute(%q(
    alter table stratum_worker_submissions
    alter column created_at
    drop default
  ))
end

Bemærk, at hvis du begynder at ændre skemaet manuelt med SQL, kan du begynde at gøre ting, der ikke vises i db/schema.rb da du hurtigt kan komme ind i SQL, som ActiveRecord ikke forstår. Hvis det sker, kan du ændre fra db/schema.rb til db/structure.sql ved at ændre config/application.rb :

config.active_record.schema_format = :sql

og derefter erstatte db/schema.rb med db/structure.sql i revisionskontrol og ved at bruge db:structure rake opgaver i stedet for det sædvanlige db:schema opgaver.




  1. JDBC video tutorials

  2. Postgres Kontroller, om IP (inet) er i en liste over IP-områder

  3. SQL:Hent poster, der opfylder betingelser, der kommer fra flere poster

  4. MySql SUM() funktion