Det är inte väldokumenterat men du kan ange en lambda som standardvärde i en migrering och det kommer att göra det rätta. Om du säger så här:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
då kommer kolumnens standardvärde att sättas till now()
och databasfunktionen now()
anropas inte förrän ett standardvärde behövs för kolumnen. Sedan om du \d stratum_worker_submissions
i psql
du kommer att se:
created_at | timestamp without time zone | not null default now()
som önskat. Alla andra standardvärden kommer att utvärderas när migreringen körs och du kommer att få en fast tidsstämpel som standard.
Alternativt kan du alltid göra det för hand med 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
Observera att om du börjar ändra schemat manuellt med SQL kan du börja göra saker som inte visas i db/schema.rb
eftersom du snabbt kan komma in i SQL som ActiveRecord inte förstår. Om det händer kan du ändra från db/schema.rb
till db/structure.sql
genom att ändra config/application.rb
:
config.active_record.schema_format = :sql
och ersätter sedan db/schema.rb
med db/structure.sql
i revisionskontroll och med db:structure
rake-uppgifter istället för det vanliga db:schema
uppgifter.