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.