# 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
# 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
7 回答
创建具有
change_column
语句且具有:default =>
值的迁移 .change_column :my_table, :my_column, :integer, :default => 0, :null => false
见:change_column
根据数据库引擎,您可能需要使用
change_column_null
导轨4:
Rails 4(其他Rails 4答案有问题):
更改其中包含NULL值的列不允许NULL将导致问题 . 这正是在开发设置中可以正常工作的代码类型,然后在您尝试将其部署到LIVE 生产环境 时崩溃 . 您应该首先将NULL值更改为有效的值,然后禁止NULL .
change_column_null
中的第4个值就是这样 . 有关详细信息,请参阅documentation .另外,我通常更喜欢为字段设置默认值,因此每次创建新对象时都不需要指定字段的值 . 我还包括注释掉的代码 .
如果你在迁移中执行它,那么你可能会这样做:
在Rails 4中,这是一个更好的(DRYer)解决方案:
要确保该列中没有
NULL
值的记录,您可以传递第四个参数,该参数是用于具有NULL
值的记录的默认值:在 Rails 4.02+ 中,根据docs,没有像
update_all
这样的方法有2个参数 . 相反,可以使用此代码:如果您有现有记录,则不能使用add_timestamps和null:false,因此这里是解决方案: