我已在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
答案 0 :(得分:4)
在回滚之前更改迁移是个坏主意。根据Rails 5 documentation change_column_default
要求from
和to
属性是可逆的。
在Rails 5中,迁移应如下所示:
class AddDefaultToUsersActivated < ActiveRecord::Migration
def change
change_column_default :users, :activated, from: nil, to: false
end
end
在Rails 4中,您应该将change
方法与up
和down
区分为@ChrisBarthol建议,因为from
和to
选项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)
当您回滚时,您希望默认为什么?从您编写的迁移开始,对于应该设置的默认值不够明确。添加from
和to
应该可以解决问题,但在我看来,对于这样的迁移,最好明确上下方法正在做什么。
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
。