web-dev-qa-db-fra.com

Rails migrations: Annuler le paramètre par défaut pour une colonne

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?

192
wulfovitch

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
387
Jeremy Mack

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)
23
Serx

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
14
Alex Fortuna