2016-07-26 56 views
1

我已经在我的用户表中添加了“激活”作为布尔值。我忘了将它添加到虚假的默认,所以我产生这种迁移:我是如何获得不可逆转迁移的?

rails g migration add_default_to_users_activated 

我,然后加入3号线在这里:

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

我然后跑迁移瓦特/出任何问题。我意识到我应该加“假”,而不是“真”,所以我想扭转迁移,只是改变add_default_to_users_activated.rb文件“假” 然而,当我运行

rake db:rollback 

耙被中止由于到ActiveRecord :: IrreversibleMigration。

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

编辑: 我运行轨道4.2

+1

可能的重复:https://stackoverflow.com/questions/31552604/reversible-migration-for-change-column-default-from-not-having-any-default-in-ra – teksisto

回答

3

这是一个坏主意回滚之前更改迁移。根据Rails 5 documentationchange_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 
+0

我试过你的答案,但得到了使用推荐的更改运行迁移时发生Postgresql特定错误。 PG不接受这种“迁移”类型吗? – Michael

+0

不,它不是postgres特定的,它是Rails版本特定的。我已经更新了我的答案。 – teksisto

+0

对不起,应该有明确的书面4.2,对于任何未来的读者都会这样做。 Rails 5看起来更简单一些,谢谢跟进。 – Michael

3

当你回滚你期望的默认值是什么?从你写的迁移来看,它的默认设置不够明确。添加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,您可以重新编辑迁移到虚假和rake db:migrate