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


当前回答

在Rails 4.02+中,根据文档,没有像update_all这样带有2个参数的方法。相反,你可以使用下面的代码:

# 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.02+中,根据文档,没有像update_all这样带有2个参数的方法。相反,你可以使用下面的代码:

# 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

Rails 4:

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

如果你有现有的记录,你不能使用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