还原迁移时的ActiveRecord :: IrreversibleMigration异常

时间:2014-02-25 10:28:27

标签: mysql ruby-on-rails ruby-on-rails-3 activerecord rails-migrations

我创建了以下Active Record Migration,它添加并删除了一些索引。

class FixIndexes < ActiveRecord::Migration
  def change
    add_index :table1, :field1, :unique => true

    remove_index :table2, :name => "index_table2_on_field1"
    remove_index :table2, :name => "index_table2_on_field2"

    remove_index :table3, :name => "index_table3_on_field1"
    add_index :table3, [:field1, :field2]
  end
end

当我运行迁移($ bundle exec rake db:migrate)时,它可以正常工作。

不幸的是,当我尝试恢复迁移($ bundle exec rake db:rollback)时,它无效并引发ActiveRecord::IrreversibleMigration异常

==  FixIndexes: reverting =====================================================
rake aborted!
An error has occurred, all later migrations canceled:

ActiveRecord::IrreversibleMigration/usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.14/lib/active_record/migration/command_recorder.rb:42:in `block in inverse'
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/activerecord-3.2.14/lib/active_record/migration/command_recorder.rb:40:in `map'

我的问题是:

  1. 为什么这是不可逆转的迁移?它只是添加和 删除一些索引,而不是数据。
  2. 如果我使用def self.updef self.down,它会解决问题 而不是def change
  3. 如何在不添加和删除的情况下立即恢复此更改 从MySQL手动索引?

1 个答案:

答案 0 :(得分:5)

在Rails中只有少数命令是可逆的(没有手动命令)。他们是

  • add_column

  • add_index

  • add_timestamps

  • CREATE_TABLE

  • create_join_table

  • remove_timestamps

  • rename_column

  • rename_index

  • rename_table

参考here

您的迁移包含remove_index CommandRecorder不支持回滚。

如果您选中Documentation

  

某些转变具有破坏性,但却无法实现   逆转。这种移民应该提高   在down方法中 ActiveRecord :: IrreversibleMigration 异常。

您的情况属实,显然导致ActiveRecord::IrreversibleMigration例外。

长话短说:如果没有手动命令,remove_index无法撤消。