如何在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?