702 votes

Comment déposer des colonnes en utilisant la migration Rails

Quelle est la syntaxe pour supprimer une colonne de table de base de données lors d'une migration Rails ?

1028voto

Nick Hammond Points 2548
remove_column :table_name, :column_name

Par exemple :

remove_column :users, :hobby

supprimerait la colonne hobby de la table des utilisateurs.

14 votes

Et assurez-vous de faire ça à l'intérieur up y down les méthodes, et non change comme expliqué dans la réponse de @Powers.

8 votes

@XåpplI'-I0llwlg'I-Merci pour le commentaire. La méthode de modification peut être utilisée pour déposer une colonne dans les applications Rails 4, mais ne doit pas être utilisée dans Rails 3. J'ai mis à jour ma réponse en conséquence.

9 votes

Vous pouvez également utiliser remove_column :table_name, :column_name, :type, :options au sein de la change car si vous spécifiez le type, il est possible de revenir sur la migration. Extrait de la documentation : Le site type y options Les paramètres seront ignorés s'ils sont présents. Il peut être utile de les fournir dans le fichier de migration change pour qu'elle puisse être annulée. Dans ce cas, type y options sera utilisé par add_column.

395voto

prabu Points 2181

Pour les anciennes versions de Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Pour Rails 3 et plus

rails generate migration RemoveFieldNameFromTableName field_name:datatype

21 votes

"rails g" peut être utilisé comme une alternative à "rails generate".

47 votes

rails g migration remove_field_name_from_table_name field_name:datatype fonctionne également

7 votes

Notez également que AddXXXtoTTT un RemoveXXXFromTTT peut être suivie d'une liste de nom de fichier:type de données, et les instructions add_column et remove_column appropriées seront créées : rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integer supprime deux attributs en utilisant une seule migration. Notez également que remove_column n'est pas pris en charge par change vous devez donc écrire les deux méthodes up y down .

126voto

Powers Points 1742

Rails 4 a été mis à jour, de sorte que la méthode de changement peut être utilisée dans la migration pour supprimer une colonne et la migration se déroulera avec succès. Veuillez lire l'avertissement suivant pour les applications Rails 3 :

Rails 3 Avertissement

Veuillez noter que lorsque vous utilisez cette commande :

rails generate migration RemoveFieldNameFromTableName field_name:datatype

La migration générée ressemblera à quelque chose comme ceci :

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Veillez à ne pas utiliser la méthode de modification lorsque vous supprimez des colonnes d'une table de base de données (exemple de ce que vous ne voulez pas dans le fichier de migration dans les applications Rails 3) :

  def change
    remove_column :table_name, :field_name
  end

La méthode de modification de Rails 3 n'est pas intelligente lorsqu'il s'agit de remove_column, vous ne pourrez donc pas revenir en arrière lors de cette migration.

3 votes

Puis lancez rake db:migrate

1 votes

@Powers - réponse brillante et claire - pourriez-vous développer ce qui suit : "La méthode de changement dans Rails 3 n'est pas intelligente lorsqu'il s'agit de remove_column, donc vous ne pourrez pas revenir en arrière dans cette migration."

1 votes

@BKSpurgeon - Dans Rails 3, si vous utilisez l'option change alors la méthode rake db:rollback se trompera. rake db:rollback est fondamentalement l'opposé de rake db:migrate . Ce bug a été corrigé dans Rails 4 :)

44voto

Dans une application rails4, il est possible d'utiliser la méthode de modification également pour supprimer des colonnes. Le troisième paramètre est le data_type et dans le quatrième paramètre optionnel vous pouvez donner des options. C'est un peu caché dans la section 'Available transformations' sur la documentation .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

37voto

superluminary Points 5496

Il y a deux bonnes façons de le faire :

supprimer_colonne

Vous pouvez simplement utiliser remove_column, comme ceci :

remove_column :users, :first_name

Cette solution convient parfaitement si vous ne devez apporter qu'une seule modification à votre schéma.

bloc change_table

Vous pouvez également le faire en utilisant un bloc change_table, comme ceci :

change_table :users do |t|
  t.remove :first_name
end

Je préfère cela car je le trouve plus lisible, et vous pouvez faire plusieurs changements à la fois.

Voici la liste complète des méthodes change_table prises en charge :

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X