Est-ce que rename_column s’occupe des index?

Disons que nous avons quelque chose comme ça:

add_column :users, :single, :boolean add_index :users, :single 

et puis plus tard nous faisons

 rename_column :users, :single, :married 

Est-ce qu’ActiveRecord et / ou la firebase database gèrent également le renommage de l’index ou dois-je supprimer manuellement l’index et l’append à nouveau?

Pour PostgreSQL, rename_column est implémenté comme un simple ALTER TABLE ... RENAME COLUMN ... et conserve les index.

Les versions de MySQL (les deux) font un ALTER TABLE ... CHANGE ... et cela préserve également les index.

La version SQLite semble copier l’intégralité de la table (avec des index), supprimez l’ancienne et copiez la copie dans le nom de la table d’origine. La copie semble gérer le renommage de la colonne lors de la copie des index:

 def copy_table(from, to, options = {}) #... copy_table_indexes(from, to, options[:rename] || {}) 

et à l’intérieur copy_table_indexes :

 columns = index.columns.map {|c| rename[c] || c }.select do |column| to_column_names.include?(column) end 

Ainsi, les pilotes standard conserveront vos index lorsque vous faites un rename_column et que le pilote SQLite s’efforce de le faire.

La documentation de l’API ne spécifie aucun comportement particulier, de sorte que d’autres pilotes peuvent faire d’autres choses. La documentation la plus proche en ce qui concerne les index est la suivante: active_record/migration.rb :

rename_column(table_name, column_name, new_column_name) : Renomme une colonne mais en conserve le type et le contenu.

Je pense que tout pilote conserverait les index, mais il n’y a aucune garantie; un pilote écrivain serait certainement stupide de ne pas conserver les index.

Ce n’est pas une réponse définitive ou faisant autorité, mais vos index doivent être conservés si vous utilisez les pilotes standard PostgreSQL, MySQL (l’un des deux) ou SQLite.


Notez que même si l’index lui-même survit à la modification de la colonne, rien ne garantit que le nom de l’index sera modifié. Cela ne devrait pas poser de problème à moins que vous ne fassiez quelque chose (comme le supprimer manuellement) qui se soucie du nom de l’index plutôt que des colonnes concernées.

Le comportement ci-dessus a changé dans Rails 4 :

  • Dans Rails 4.0, lorsqu’une colonne ou une table est renommée, les index associés sont également renommés. Si vous avez des migrations qui renomment les index, ils ne sont plus nécessaires.

Ainsi, ActiveRecord renomme automatiquement les index pour correspondre aux nouveaux noms de table ou de colonne lorsque vous renommez le tableau ou la colonne. Merci à sequielo pour le heads-up à ce sujet.