Le problème, c'est que j'ai une migration dans Rails qui configure un paramètre par défaut pour une colonne, comme dans l'exemple suivant:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
Supposons que j'aime supprimer ces paramètres par défaut lors d'une migration ultérieure. Comment procéder de la sorte en utilisant Rails migrations?
Ma solution actuelle consiste à exécuter une commande SQL personnalisée dans la migration Rails), comme ceci:
def self.up
execute 'alter table column_name alter bought_at drop default'
end
Mais je n'aime pas cette approche, car je suis maintenant tributaire de la façon dont la base de données sous-jacente interprète cette commande. En cas de changement de la base de données, cette requête risque de ne plus fonctionner et la migration serait interrompue. Alors, est-il possible d'exprimer l'annulation d'un paramètre par défaut pour une colonne dans des rails?
def change
change_column_default( :table_name, :column_name, from: nil, to: false )
end
def up
change_column_default( :table_name, :column_name, nil )
end
def down
change_column_default( :table_name, :column_name, false )
end
Sons comme si vous faisiez ce qu'il fallait avec votre "exécuter", comme le soulignent les docs:
change_column_default(table_name, column_name, default)
Définit une nouvelle valeur par défaut pour une colonne. Si vous souhaitez définir la valeur par défaut sur NULL, vous n'avez aucune chance. Vous devez DatabaseStatements # exécuter vous-même l'instruction SQL appropriée. Exemples
change_column_default(:suppliers, :qualification, 'new') change_column_default(:accounts, :authorized, 1)
L'extrait suivant que j'utilise pour créer NULL
columns NOT NULL
, mais ignore DEFAULT
au niveau du schéma:
def self.up
change_column :table, :column, :string, :null => false, :default => ""
change_column_default(:table, :column, nil)
end