What's the correct syntax for remove_index in a Rails 3.1.0 migration?

doublea picture doublea · Jan 27, 2012 · Viewed 51.5k times · Source

I'm in the process of adding Devise to an existing Rails app, with a Users table already defined. The devise generator pushed out the following migration:

class AddDeviseToUsers < ActiveRecord::Migration
  def self.up
    change_table(:users) do |t|

     ## Database authenticatable
     t.string :email,              :null => false, :default => ""
     t.string :encrypted_password, :null => false, :default => ""

     ## Recoverable
     t.string   :reset_password_token
     t.datetime :reset_password_sent_at

     ## Rememberable
     t.datetime :remember_created_at

     ## Trackable
     t.integer  :sign_in_count, :default => 0

     blah blah blah....

   end

   add_index :users, :email,                :unique => true
   add_index :users, :reset_password_token, :unique => true
 end

The downward migration isn't generated, and I'm having a heck of a time removing those indexes. I'm seeing different suggested notation in the documentation, and different suggestions online, but none of them seem to be working for me. For example...

def self.down
  change_table(:users) do |t|
    t.remove  :email
    t.remove  :encrypted_password

    t.remove  :reset_password_token

    blah blah blah...
  end

  remove_index :users, :email
  remove_index :users, :reset_password_token
end

results in...

An error has occurred, this and all later migrations canceled:

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

which is odd, because if I check the database, sure enough, 'index_users_on_email' is right there...

I've tried other variations, including

remove_index :users, :column => :email

remove_index :users, 'email'

or:

change_table(:users) do |t|
  t.remove_index :email
end

...but no dice. I'm running Rails 3.1.0, Ruby 1.9.2, rake 0.9.2.2, with Postgres.

The command that's letting me down is:

bundle exec rake db:rollback STEP=1

after successfully apply the migration up. Any advice?

Answer

Dty picture Dty · Jul 12, 2012

For the record, the way to remove an index by name is

remove_index(:table_name, :name => 'index_name')

so in your case

remove_index(:users, :name => 'index_users_on_email')