Rails migrations: Annuler réglage par défaut pour une colonne
-
23-08-2019 - |
Question
J'ai le problème, que j'ai une migration dans Rails qui met en place un paramètre par défaut pour une colonne, comme dans cet exemple:
def self.up
add_column :column_name, :bought_at, :datetime, :default => Time.now
end
Supposons, je veux laisser tomber que les paramètres par défaut dans une migration plus tard, comment puis-je le faire avec l'aide de la migration des rails?
Ma solution actuelle est l'exécution d'une commande SQL personnalisée dans la migration des rails, comme ceci:
def self.up
execute 'alter table column_name alter bought_at drop default'
end
Mais je n'aime pas cette approche, parce que je suis dépendant maintenant de la façon dont la base de données sous-jacente interprète cette commande. Dans le cas d'un changement de la base de données cette requête peut-être peut-être pas plus travailler et la migration serait brisée. Alors, est-il un moyen d'exprimer l'annulation d'un paramètre par défaut pour une colonne dans des rails?
La solution
Rails 5 +
def change
change_column_default( :table_name, :column_name, from: nil, to: false )
end
rails 3 et rails 4
def up
change_column_default( :table_name, :column_name, nil )
end
def down
change_column_default( :table_name, :column_name, false )
end
Autres conseils
sons comme vous faites la bonne chose avec votre « exécuter », comme les documents indiquent:
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 à NULL, vous êtes hors de la chance. Vous avez besoin à DatabaseStatements # exécuter la déclaration appropriée de SQL vous. Exemples
change_column_default(:suppliers, :qualification, 'new') change_column_default(:accounts, :authorized, 1)
L'extrait suivant que j'utilise pour faire des colonnes de NULL
NOT NULL
, mais passez DEFAULT
au niveau du schéma:
def self.up
change_column :table, :column, :string, :null => false, :default => ""
change_column_default(:table, :column, nil)
end
Rails 4
change_column :courses, :name, :string, limit: 100, null: false