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?
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 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
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
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
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