如何在ActiveRecord迁移中添加默认值为FALSE但现有数据为TRUE的列
实现方法
要让现有数据的didFoo值为true,同时新数据默认使用false,需要拆分迁移步骤,避免添加列时直接给所有行设默认值:
class AddDidFoo < ActiveRecord::Migration[6.1] def change # 1. 先添加布尔列,暂时不设置默认值 add_column :mytable, :didFoo, :boolean # 2. 更新所有现有数据行的didFoo为true MyTable.update_all(didFoo: true) # 3. 为列设置默认值false,后续新增数据会自动使用这个默认值 change_column_default :mytable, :didFoo, false end end
注意事项
- 确保
MyTable是对应数据库表的Rails模型类名(首字母大写、单数形式),如果模型名和表名不匹配,也可以直接用原生SQL更新:execute "UPDATE mytable SET didFoo = true;" - 若表数据量极大,
update_all可能存在性能问题,此时建议用分批更新或者直接执行原生SQL语句。
内容的提问来源于stack exchange,提问作者gerbil
相关产品推荐
相关产品推荐

