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.