Не е добре документиран, но можете да предоставите ламбда като стойност по подразбиране при миграция и това ще направи правилното нещо. Ако кажете това:
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
задачи.