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

In una migrazione di Rails, come faccio a impostare il valore predefinito di una colonna su NOW() invece dell'ora in cui ho eseguito la migrazione?

Non è ben documentato, ma puoi fornire un lambda come valore predefinito in una migrazione e ciò farà la cosa giusta. Se dici questo:

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

quindi il valore predefinito della colonna verrà impostato su now() e la funzione di database now() non verrà chiamato finché non sarà necessario un valore predefinito per la colonna. Quindi se \d stratum_worker_submissions in psql vedrai:

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

come desiderato. Qualsiasi altro valore predefinito verrà valutato durante l'esecuzione della migrazione e ti ritroverai con un timestamp fisso come predefinito.

In alternativa, puoi sempre farlo a mano usando 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

Nota che se inizi a modificare manualmente lo schema con SQL potresti iniziare a fare cose che non appariranno in db/schema.rb poiché puoi entrare rapidamente in SQL che ActiveRecord non capisce. Se ciò accade, puoi cambiare da db/schema.rb a db/structure.sql modificando config/application.rb :

config.active_record.schema_format = :sql

e quindi sostituendo db/schema.rb con db/structure.sql nel controllo di revisione e utilizzando il db:structure rake task al posto del solito db:schema compiti.