PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Dans une migration Rails, comment définir la valeur par défaut d'une colonne sur NOW() au lieu de l'heure à laquelle j'ai exécuté la migration ?

Ce n'est pas bien documenté mais vous pouvez fournir un lambda comme valeur par défaut dans une migration et cela fera la bonne chose. Si vous dites ceci :

def change
  change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end

alors la valeur par défaut de la colonne sera définie sur now() et la fonction de base de données now() ne sera pas appelée tant qu'une valeur par défaut n'est pas nécessaire pour la colonne. Ensuite, si vous \d stratum_worker_submissions dans psql vous verrez :

created_at | timestamp without time zone | not null default now()

comme voulu. Toute autre valeur par défaut sera évaluée lors de l'exécution de la migration et vous vous retrouverez avec un horodatage fixe par défaut.

Alternativement, vous pouvez toujours le faire à la main en utilisant 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

Notez que si vous commencez à modifier manuellement le schéma avec SQL, vous pourriez commencer à faire des choses qui n'apparaîtront pas dans db/schema.rb car vous pouvez rapidement entrer dans SQL qu'ActiveRecord ne comprend pas. Si cela se produit, vous pouvez changer de db/schema.rb vers db/structure.sql en modifiant config/application.rb :

config.active_record.schema_format = :sql

puis en remplaçant db/schema.rb avec db/structure.sql dans le contrôle de révision et en utilisant le db:structure tâches de rake à la place de l'habituel db:schema tâches.