Det er ikke veldokumenteret, men du kan levere en lambda som standardværdi i en migrering, og det vil gøre det rigtige. Hvis du siger dette:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
så vil kolonnens standardværdi blive sat til now()
og databasefunktionen now()
kaldes ikke før en standardværdi er nødvendig for kolonnen. Så hvis du \d stratum_worker_submissions
i psql
du vil se:
created_at | timestamp without time zone | not null default now()
som ønsket. Enhver anden standard vil blive evalueret, når migreringen kører, og du ender med et fast tidsstempel som standard.
Alternativt kan du altid gøre det i hånden ved hjælp af 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
Bemærk, at hvis du begynder at ændre skemaet manuelt med SQL, kan du begynde at gøre ting, der ikke vises i db/schema.rb
da du hurtigt kan komme ind i SQL, som ActiveRecord ikke forstår. Hvis det sker, kan du ændre fra db/schema.rb
til db/structure.sql
ved at ændre config/application.rb
:
config.active_record.schema_format = :sql
og derefter erstatte db/schema.rb
med db/structure.sql
i revisionskontrol og ved at bruge db:structure
rake opgaver i stedet for det sædvanlige db:schema
opgaver.