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

Em uma migração Rails, como faço para definir o valor padrão de uma coluna como NOW() em vez da hora em que executei a migração?


Não está bem documentado, mas você pode fornecer um lambda como o valor padrão em uma migração e isso fará a coisa certa. Se você disser isso:
def change
  change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end

então o valor padrão da coluna será definido como now() e a função de banco de dados now() não será chamado até que um valor padrão seja necessário para a coluna. Então, se você \d stratum_worker_submissions em psql Você vai ver:
created_at | timestamp without time zone | not null default now()

como desejado. Qualquer outro padrão será avaliado quando a migração for executada e você terminará com um timestamp fixo como padrão.

Alternativamente, você sempre pode fazer isso manualmente 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

Observe que, se você começar a alterar manualmente o esquema com SQL, poderá começar a fazer coisas que não aparecerão em db/schema.rb como você pode entrar rapidamente no SQL que o ActiveRecord não entende. Se isso acontecer, você pode mudar de db/schema.rb para db/structure.sql alterando config/application.rb :
config.active_record.schema_format = :sql

e, em seguida, substituindo db/schema.rb com db/structure.sql no controle de revisão e usando o db:structure tarefas de rake no lugar do usual db:schema tarefas.