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.