Не е добре документиран, но можете да предоставите ламбда като стойност по подразбиране при миграция и това ще направи правилното нещо. Ако кажете това:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
тогава стойността по подразбиране на колоната ще бъде зададена на now() и функцията на базата данни now() няма да бъде извикан, докато не е необходима стойност по подразбиране за колоната. След това, ако \d stratum_worker_submissions в psql ще видите:
created_at | timestamp without time zone | not null default now()
по желание. Всички други стойности по подразбиране ще бъдат оценени, когато миграцията се изпълнява, и ще получите фиксирано клеймо за час по подразбиране.
Като алтернатива винаги можете да го направите на ръка, като използвате 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
Имайте предвид, че ако започнете ръчно да променяте схемата с SQL, може да започнете да правите неща, които няма да се показват в db/schema.rb тъй като можете бързо да влезете в SQL, който ActiveRecord не разбира. Ако това се случи, можете да промените от db/schema.rb към db/structure.sql чрез промяна на config/application.rb :
config.active_record.schema_format = :sql
и след това заместване на db/schema.rb с db/structure.sql в контрола на ревизиите и използвайки db:structure рейк задачи вместо обичайната db:schema задачи.