Non è ben documentato, ma puoi fornire un lambda come valore predefinito in una migrazione e ciò farà la cosa giusta. Se dici questo:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
quindi il valore predefinito della colonna verrà impostato su now()
e la funzione di database now()
non verrà chiamato finché non sarà necessario un valore predefinito per la colonna. Quindi se \d stratum_worker_submissions
in psql
vedrai:
created_at | timestamp without time zone | not null default now()
come desiderato. Qualsiasi altro valore predefinito verrà valutato durante l'esecuzione della migrazione e ti ritroverai con un timestamp fisso come predefinito.
In alternativa, puoi sempre farlo a mano usando 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
Nota che se inizi a modificare manualmente lo schema con SQL potresti iniziare a fare cose che non appariranno in db/schema.rb
poiché puoi entrare rapidamente in SQL che ActiveRecord non capisce. Se ciò accade, puoi cambiare da db/schema.rb
a db/structure.sql
modificando config/application.rb
:
config.active_record.schema_format = :sql
e quindi sostituendo db/schema.rb
con db/structure.sql
nel controllo di revisione e utilizzando il db:structure
rake task al posto del solito db:schema
compiti.