Není to dobře zdokumentováno, ale můžete zadat lambda jako výchozí hodnotu při migraci, což udělá správnou věc. Pokud řeknete toto:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
pak bude výchozí hodnota sloupce nastavena na now() a databázová funkce now() nebude volána, dokud nebude pro sloupec vyžadována výchozí hodnota. Pak pokud \d stratum_worker_submissions v psql uvidíte:
created_at | timestamp without time zone | not null default now()
podle přání. Jakékoli jiné výchozí nastavení bude vyhodnoceno při spuštění migrace a skončíte s pevným časovým razítkem jako výchozím.
Případně to můžete vždy provést ručně pomocí 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
Pamatujte, že pokud začnete ručně měnit schéma pomocí SQL, můžete začít dělat věci, které se neobjeví v db/schema.rb jak se můžete rychle dostat do SQL, kterému ActiveRecord nerozumí. Pokud k tomu dojde, můžete to změnit z db/schema.rb na db/structure.sql změnou config/application.rb :
config.active_record.schema_format = :sql
a poté nahrazením db/schema.rb s db/structure.sql v kontrole revizí a pomocí db:structure úlohy rake namísto obvyklých db:schema úkoly.