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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top