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

Supposons que je crée une table dans une application Rails. Quelque temps après, j’ajoute une colonne en cours d’exécution:

 rails generate migration AddUser_idColumnToTable user_id:ssortingng. 

Ensuite, je réalise que je dois append user_id comme index. Je connais la méthode add_index , mais où cette méthode doit-elle être appelée? Suis-je censé effectuer une migration (si oui, laquelle?), Puis append manuellement cette méthode?

Vous pouvez exécuter une autre migration, uniquement pour l’index:

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

Si vous avez besoin de créer un user_id il serait raisonnable de penser que vous référencez une table utilisateur. Dans ce cas, la migration sera:

 rails generate migration AddUserRefToProducts user:references 

Cette commande générera 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 une colonne et un index sera ajouté à product table de product .

Si vous avez juste besoin d'append un index à une colonne existante, par exemple le name d'une table user , la technique suivante peut être utile:

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

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

Supprimez la ligne add_column et exécutez la migration.

Dans le cas décrit, vous pourriez avoir émis des rails generate migration AddIndexIdToTable index_id:integer:index commande d' rails generate migration AddIndexIdToTable index_id:integer:index , puis supprimer la ligne add_column de la migration générée. Mais je préfèrerais plutôt annuler la migration initiale et append une référence à la place:

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

Ajouter la migration générée après avoir créé la colonne comme suit (exemple)

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

Pour les références, vous pouvez appeler

 rails generate migration AddUserIdColumnToTable user:references 

Si à l’avenir vous devez append un index général, vous pouvez le lancer

 rails g migration AddOrdinationNumberToTable ordination_number:integer:index 

Générer du code:

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