Het is niet goed gedocumenteerd, maar je kunt een lambda als standaardwaarde in een migratie opgeven en dat zal het juiste doen. Als je dit zegt:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
dan wordt de standaardwaarde van de kolom ingesteld op now()
en de databasefunctie now()
wordt pas aangeroepen als er een standaardwaarde voor de kolom nodig is. Als je dan \d stratum_worker_submissions
in psql
je zult zien:
created_at | timestamp without time zone | not null default now()
zoals gewenst. Elke andere standaardwaarde wordt geëvalueerd wanneer de migratie wordt uitgevoerd en u krijgt standaard een vast tijdstempel.
U kunt het ook altijd handmatig doen met 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
Houd er rekening mee dat als u het schema handmatig met SQL gaat wijzigen, u mogelijk dingen gaat doen die niet in db/schema.rb
verschijnen omdat u snel in SQL kunt komen dat ActiveRecord niet begrijpt. Als dat gebeurt, kun je veranderen van db/schema.rb
naar db/structure.sql
door config/application.rb
. te wijzigen :
config.active_record.schema_format = :sql
en dan db/schema.rb
te vervangen met db/structure.sql
in revisiebeheer en het gebruik van de db:structure
rake taken in plaats van de gebruikelijke db:schema
taken.