【问题标题】:How did I get a IrreversibleMigration?我是如何获得不可逆迁移的?
【发布时间】:2016-07-26 17:53:02
【问题描述】:

我已经在我的用户表中添加了“激活”作为布尔值。我忘记将它添加为默认值,所以我生成了这个迁移:

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

rake 由于 ActiveRecord::IrreversibleMigration 而中止。

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

编辑: 我正在运行 rails 4.2

【问题讨论】:

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


【解决方案1】:

在回滚之前更改迁移是个坏主意。根据 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 中,您应该按照 @ChrisBarthol 的建议将 change 方法与 updown 分开,因为 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

【讨论】:

  • 我尝试了您的答案,但在使用您建议的更改运行迁移时遇到了 Postgresql 特定错误。 PG 不接受这种“类型”的迁移吗?
  • 不,这不是 postgres 特定的,它是 Rails 版本特定的。我已经更新了我的答案。
  • 对不起,应该明确写成 4.2,这对任何未来的读者都会有用。而且 Rails 5 看起来更简单,感谢您的跟进。
【解决方案2】:

当您回滚时,您希望默认是什么?从您编写的迁移中,对于应该设置的默认值不够明确。添加 fromto 应该可以解决问题,但我认为对于像这样的迁移,最好明确说明 up 和 down 方法的作用。

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

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多