sql >> Base de Datos >  >> RDS >> PostgreSQL

En una migración de Rails, ¿cómo configuro el valor predeterminado de una columna para que sea AHORA () en lugar de la hora en que ejecuté la migración?

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.