我创建了以下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'
我的问题是:
def self.up
和def self.down
,它会解决问题
而不是def change
?答案 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无法撤消。