ECのウェブ担当者のメモ

ECサイトを運営管理している、WEB担当プログラマのメモ

スポンサーリンク

Railsのmigrationのremove_indexで名前を変更したIndexを削除する方法

f:id:jun9632:20160330145646p:plain

Railsのmigrationでindexを削除しようと思って 最初以下のように書いたら怒られました。

remove_index :items,  [:shop_id,  :item_id]

出力されたエラーメッセージは以下のような感じです。

Index name 'index_items_on_shop_id_and_item_id' on table 'items' does not exist

なぜ、怒られた方と言えば、index名を変更していたんですね。

indexを作成するときに、以下の用に作成していたんです。

 add_index :items, column: [:shop_id,  :item_id], name: 'index_items_on_shop_id_and_item_id_xxxxxxxxxxxxxx'

どうやら、remove_indexするときもカラム名から勝手にindex名を作って その名前のindexを探して削除しに行くのだと思われます。

で、ドキュメントをみたら、ちゃんとオプションがあったので オプション指定してやらないと行けないみたいです。

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

下記はサンプルです。

unique 条件をを外したいパターンです。

# -*- encoding : utf-8 -*-
class ChangeUniqueIndexToOrderItem < ActiveRecord::Migration
  def up
    remove_index :items, column: [:shop_id,  :item_id], name: 'index_items_on_shop_id_and_item_id_xxxxxxxxxxxxxx'
    add_index :items, column: [:shop_id,  :item_id], name: 'index_items_on_shop_id_and_item_id_xxxxxxxxxxxxxx'
  end

  def down
    remove_index :items, column: [:shop_id,  :item_id], name: 'index_items_on_shop_id_and_item_id_xxxxxxxxxxxxxx'
    add_index :items, column: [:shop_id,  :item_id], unique: true, name: 'index_items_on_shop_id_and_item_id_xxxxxxxxxxxxxx'
  end
end

関連記事

marketing-web.hatenablog.com