我在以前的迁移中创建了一个日期列,并将其设置为可空。现在我想把它改成非空。假设数据库中有空行,我该怎么做呢?我可以把这些列设置为时间。现在如果它们是空的。


当前回答

如果你在迁移中这样做,那么你可能会这样做:

# 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

其他回答

创建一个迁移,它有一个change_column语句,值为:default =>。

change_column :my_table, :my_column, :integer, :default => 0, :null => false

看:change_column

根据数据库引擎的不同,您可能需要使用change_column_null

如果你在迁移中这样做,那么你可能会这样做:

# 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

如果你有现有的记录,你不能使用add_timestamps和null:false,所以这里是解决方案:

def change
  add_timestamps(:buttons, null: true)

  Button.find_each { |b| b.update(created_at: Time.zone.now, updated_at: Time.zone.now) }

  change_column_null(:buttons, :created_at, false)
  change_column_null(:buttons, :updated_at, false)
end

在Rails 4中,这是一个更好的(dry)解决方案:

change_column_null :my_models, :date_column, false

为了确保该列中不存在NULL值的记录,您可以传递第四个参数,这是用于NULL值记录的默认值:

change_column_null :my_models, :date_column, false, Time.now

Rails 4:

def change
  change_column_null(:users, :admin, false )
end