読者です 読者をやめる 読者になる 読者になる

Railsでindexを消そうとしたらコケた

railsの4.2.6のmigration周りの話

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.integer :age

      t.timestamps
    end

    add_index :users, :name
  end
end

仮に上記のようなテーブルを作成してnameindexをはる
すると自動で index_users_on_name という名前がつく
この名前は add_index にname optionを指定することで任意の名前にできる

add_index - リファレンス - - Railsドキュメント

add_index :users, :name, name: 'by_name'

本題はこれからでindexを消そうと思ってmigrationファイルを

class RemoveIndexFromUsers < ActiveRecord::Migration
  def change
    remove_index :users, :name
  end
end

のように作成してmigrateすると

Index name 'index_users_on_name' on table 'users' does not exist

でエラーになる
どうやら指定した by_name というものではなくnameを指定しない場合につくnameを探しにいってる

解決策としては

remove_index :users, column: :name, name: 'by_name'

このようにindexを消すcolumnとnameを指定してあげればいけた

remove_index - リファレンス - - Railsドキュメント

※ rails5ではこの現象はおきなかった 後日調べる