Kev*_*ang 181 migration ruby-on-rails
我在之前的迁移中创建了一个日期列,并将其设置为可为空.现在我想把它改成不可空.假设该数据库中有空行,我该怎么做呢?如果它们当前为空,我可以将这些列设置为Time.now.
Dan*_*nne 192
如果你在迁移中执行它,那么你可能会这样做:
# 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
Run Code Online (Sandbox Code Playgroud)
mrb*_*rdo 150
在Rails 4中,这是一个更好的(DRYer)解决方案:
change_column_null :my_models, :date_column, false
Run Code Online (Sandbox Code Playgroud)
要确保NULL
该列中没有包含值的记录,您可以传递第四个参数,该参数是用于具有NULL
值的记录的默认值:
change_column_null :my_models, :date_column, false, Time.now
Run Code Online (Sandbox Code Playgroud)
Ric*_*ith 66
Rails 4(其他Rails 4答案有问题):
def change
change_column_null(:users, :admin, false, <put a default value here> )
# change_column(:users, :admin, :string, :default => "")
end
Run Code Online (Sandbox Code Playgroud)
更改其中包含NULL值的列不允许NULL将导致问题.这正是在开发设置中可以正常工作的代码类型,然后在您尝试将其部署到LIVE生产时崩溃.您应该首先将NULL值更改为有效的值,然后禁止NULL.第四个值change_column_null
就是这样.有关详细信息,请参阅文档
另外,我通常更喜欢为字段设置默认值,因此每次创建新对象时都不需要指定字段的值.我还包括注释掉的代码.
jes*_*rry 33
创建具有值的change_column
语句的迁移:default =>
.
change_column_null
请参阅:change_column
您可能需要使用数据库引擎 change_column
pir*_*ast 11
导轨4:
def change
change_column_null(:users, :admin, false )
end
Run Code Online (Sandbox Code Playgroud)