68 votes

Migration des rails avec ajout et suppression de référence

Après avoir créé un fichier de migration avec rails generate migration AddClientToUser je peux modifier mon fichier de migration comme suit :

 class AddClientToUser < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.references :client
    end
  end

  def self.down
    change_table :users do |t|
      t.remove :client_id
    end
  end
end

Est-ce la bonne façon d'inverser la colonne de référence ajoutée lors de la migration ?

88voto

MulleOne Points 186

Rails 4.2.1

 rails g migration RemoveClientFromUsers client:references

Génèrera une migration similaire :

 class RemoveClientFromUser < ActiveRecord::Migration
  def change
    remove_reference :users, :client, index: true, foreign_key: true
  end
end

De plus, on est libre d'ajouter une ou plusieurs autres référence(s) en ajoutant :

 add_reference :users, :model_name, index: true, foreign_key: true

dans la méthode change Enfin, exécuter rake db:migrate après avoir enregistré les modifications apportées à la migration produira les résultats souhaités.

48voto

Daniel Points 1171

c'est vrai! et tu peux aussi aller avec :

   def self.down
      remove_column :users, :client_id
  end

27voto

Ryan Points 4221

Après les rails 4, vous pouvez faire ce qui suit

 class AddClientToUser < ActiveRecord::Migration
  def change
    add_reference :users, :client, index: true
  end
end

Il gérera le haut et le bas pour vous, ainsi que la création d'un index de clé étrangère. Vous pouvez également utiliser remove_reference pour faire le contraire.

2voto

xhenryx14 Points 69

Avec Rails 4, vous pouvez simplement taper :

$ rails génère la migration AddClientRefToUser client:references

dans la console et cela fera la même chose que Ryan a dit.

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