我是如何获得IrreversibleMigration的?

时间:2016-07-26 17:53:02

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

我已在User表中添加了'activated'作为布尔值。我忘了默认将它添加到false,所以我生成了这个迁移:

rails g migration add_default_to_users_activated

然后我在这里添加了第3行:

class AddDefaultToUsersActivated < ActiveRecord::Migration
  def change
    change_column_default :users, :activated, true
  end
end

然后我运行了迁移,没有任何问题。我意识到我应该添加'false'而不是'true',所以我想要反转迁移,只需将add_default_to_users_activated.rb文件更改为'false' 但是当我跑步时

rake db:rollback
由于ActiveRecord :: IrreversibleMigration,

rake被中止。

但我设定的机制是什么,可以防止迁移被还原,我该如何解决?

编辑: 我正在运行rails 4.2

2 个答案:

答案 0 :(得分:4)

在回滚之前更改迁移是个坏主意。根据Rails 5 documentation change_column_default要求fromto属性是可逆的。

在Rails 5中,迁移应如下所示:

class AddDefaultToUsersActivated < ActiveRecord::Migration
  def change
    change_column_default :users, :activated, from: nil, to: false
  end
end

在Rails 4中,您应该将change方法与updown区分为@ChrisBarthol建议,因为fromto选项was not introduced yet

class AddDefaultToUsersActivated < ActiveRecord::Migration
  def up
    change_column_default :users, :activated, true
  end
  def down
    change_column_default :users, :activated, nil
  end
end

答案 1 :(得分:4)

当您回滚时,您希望默认为什么?从您编写的迁移开始,对于应该设置的默认值不够明确。添加fromto应该可以解决问题,但在我看来,对于这样的迁移,最好明确上下方法正在做什么。

class AddDefaultToUsersActivated < ActiveRecord::Migration
  def up
    change_column_default :users, :activated, true
  end
  def down
    change_column_default :users, :activated, nil
  end
end

然后,当您回滚时,它会将默认值设置为nil,您可以将迁移编辑为false并再次rake db:migrate