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.