No está bien documentado, pero puede proporcionar una lambda como valor predeterminado en una migración y eso hará lo correcto. Si dices esto:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
entonces el valor predeterminado de la columna se establecerá en now()
y la función de base de datos now()
no se llamará hasta que se necesite un valor predeterminado para la columna. Entonces, si \d stratum_worker_submissions
en psql
verás:
created_at | timestamp without time zone | not null default now()
como se desee. Cualquier otro valor predeterminado se evaluará cuando se ejecute la migración y terminará con una marca de tiempo fija como predeterminada.
Alternativamente, siempre puede hacerlo 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
Tenga en cuenta que si comienza a cambiar manualmente el esquema con SQL, es posible que comience a hacer cosas que no aparecerán en db/schema.rb
ya que puede acceder rápidamente a SQL que ActiveRecord no entiende. Si eso sucede, puede cambiar desde db/schema.rb
a db/structure.sql
cambiando config/application.rb
:
config.active_record.schema_format = :sql
y luego reemplazando db/schema.rb
con db/structure.sql
en el control de revisión y usando la db:structure
tareas de rake en lugar de las habituales db:schema
tareas.