如何在Rails迁移中将可空列更改为不可空?
我在之前的迁移中创建了一个日期列,并将其设置为空。 现在我想改变它不可空。 假设数据库中有空行,我该如何去做这件事? 如果他们目前为空,我可以将这些列设置为Time.now。
如果你在迁移中这样做,那么你可以这样做:
# Make sure no null value exist
MyModel.where(date_column: nil).update_all(date_column: Time.now)
# Change the column to not allow null
change_column :my_models, :date_column, :datetime, null: false
在Rails 4中,这是一个更好的解决方案(DRY):
change_column_null :my_models, :date_column, false
要确保该列中没有null
值的记录:
MyModel.update_all({ date_column: Time.now }, { date_column: nil })
Rails 4(其他Rails 4的回答有问题):
def change
change_column_null(:users, :admin, false, <put a default value here> )
# change_column(:users, :admin, :string, :default => "")
end
将其中的NULL值更改为不允许NULL将导致问题。 这正是您的开发环境中能够正常工作的代码类型,然后当您尝试将其部署到您的实时生产时会崩溃。 您应该首先将NULL值更改为有效的值,然后禁止NULL。 change_column_null
中的第4个值就是这样。 请参阅文档了解更多详情
另外,我通常更喜欢为该字段设置默认值,所以每次创建新对象时都不需要指定字段的值。 我也包含了注释掉的代码。
链接地址: http://www.djcxy.com/p/47183.html上一篇: How to change a nullable column to not nullable in a Rails migration?
下一篇: How To Drop a Table?