146 votes

Rails : Ajouter un index après avoir ajouté une colonne

Supposons que j'ai créé une table table dans une application Rails. Quelque temps plus tard, j'ajoute une colonne qui fonctionne :

rails generate migration AddUser_idColumnToTable user_id:string. 

Puis je réalise que je dois ajouter user_id comme un index. Je connais le add_index mais où cette méthode doit-elle être appelée ? Suis-je censé exécuter une migration (si oui, laquelle ?), puis ajouter à la main cette méthode ?

270voto

Jaap Haagmans Points 1354

Vous pouvez exécuter une autre migration, juste pour l'index :

class AddIndexToTable < ActiveRecord::Migration
  def change
    add_index :table, :user_id
  end
end

73voto

Vadym Tyemirov Points 918

Si vous devez créer un user_id alors il serait raisonnable de supposer que vous faites référence à une table utilisateur. Dans ce cas, la migration doit être :

rails generate migration AddUserRefToProducts user:references

Cette commande va générer la migration suivante :

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :user, :product, index: true
  end
end

Après avoir exécuté rake db:migrate à la fois user_id et un index sera ajouté à la colonne products table.

Dans le cas où vous avez juste besoin d'ajouter un index à une colonne existante, par ex. name d'un user la technique suivante peut s'avérer utile :

rails generate migration AddIndexToUsers name:string:index générera la migration suivante :

class AddIndexToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_index :users, :name
  end
end

Supprimer add_column et lancer la migration.

Dans le cas décrit, vous auriez pu émettre rails generate migration AddIndexIdToTable index_id:integer:index et ensuite supprimer add_column de la migration générée. Mais je préfère recommander d'annuler la migration initiale et d'ajouter la référence à la place :

rails generate migration RemoveUserIdFromProducts user_id:integer
rails generate migration AddUserRefToProducts user:references

14voto

rdeandrade Points 141

Ajoutez dans la migration générée après la création de la colonne ce qui suit (exemple)

add_index :photographers, :email, :unique => true

11voto

Mauro Points 1054

Pour les références, vous pouvez appeler

rails generate migration AddUserIdColumnToTable user:references

Si, à l'avenir, vous avez besoin d'ajouter un index général, vous pouvez lancer ceci

rails g migration AddOrdinationNumberToTable ordination_number:integer:index

Code généré :

class AddOrdinationNumberToTable < ActiveRecord::Migration
  def change
   add_column :tables, :ordination_number, :integer
   add_index :tables, :ordination_number, unique: true
  end
end

3voto

vidur punj Points 506

Vous pouvez utiliser ceci, pensez simplement que Job est le nom du modèle auquel vous ajoutez l'index. cader_id :

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end

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