web-dev-qa-db-fra.com

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

Supposons que je crée une table table dans une application Rails. Quelques temps plus tard, j'ajoute une colonne en cours d'exécution:

Rails generate migration AddUser_idColumnToTable user_id:string. 

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

109
user1611830

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

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

Si vous devez créer un user_id il serait alors raisonnable de supposer que vous faites référence à 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 à la fois un user_id colonne et un index seront ajoutés à la table products.

Si vous devez simplement ajouter un index à une colonne existante, par exemple, name d'une table user, la technique suivante peut être 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

Effacer add_column line et lancez la migration.

Dans le cas décrit, vous auriez pu émettre Rails generate migration AddIndexIdToTable index_id:integer:index commande puis supprimez add_column _ ligne de la migration générée. Mais je recommanderais plutôt d'annuler la migration initiale et d'ajouter une référence:

Rails generate migration RemoveUserIdFromProducts user_id:integer
Rails generate migration AddUserRefToProducts user:references
63
Vadym Tyemirov

Ajoutez dans la migration générée après avoir créé la colonne les éléments suivants (exemple)

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

Pour les références, vous pouvez appeler

Rails generate migration AddUserIdColumnToTable user:references

Si à l’avenir vous devez ajouter 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
4
Mauro

Vous pouvez l'utiliser. Pensez 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
1
vidur punj