Rails 4.2.11:如何通过迁移为表列新增默认值字段
修改Rails 4.2.11中jsonb列的默认值并更新现有记录
步骤1:生成新的迁移文件
在终端执行以下命令创建迁移文件:
rails generate migration UpdateUserDefaultInCompanies
步骤2:编写迁移逻辑
打开生成的迁移文件(路径类似db/migrate/[timestamp]_update_user_default_in_companies.rb),替换内容为:
class UpdateUserDefaultInCompanies < ActiveRecord::Migration def up # 更新列的默认值,添加新的键值对 change_column :companies, :user, :jsonb, default: { "to_dist"=>50, "from_dist"=>70, "trs_one"=>100, "trs_two"=>120, "to_limit"=>5, "from_limit"=>10 } # 为已存在的companies记录更新user字段,补上新增的键值对 # 仅匹配使用原默认值的记录,避免覆盖自定义的user数据 Company.where(user: { "to_dist"=>50, "from_dist"=>70, "trs_one"=>100, "trs_two"=>120 }).update_all( user: { "to_dist"=>50, "from_dist"=>70, "trs_one"=>100, "trs_two"=>120, "to_limit"=>5, "from_limit"=>10 } ) end def down # 回滚操作:恢复原默认值,并移除新增的键值对 change_column :companies, :user, :jsonb, default: { "to_dist"=>50, "from_dist"=>70, "trs_one"=>100, "trs_two"=>120 } # 回滚现有记录的user字段 Company.where(user: { "to_dist"=>50, "from_dist"=>70, "trs_one"=>100, "trs_two"=>120, "to_limit"=>5, "from_limit"=>10 }).update_all( user: { "to_dist"=>50, "from_dist"=>70, "trs_one"=>100, "trs_two"=>120 } ) end end
关键说明
- 用
up和down方法替代change:Rails 4.2中change_column无法自动回滚,需手动定义回滚逻辑。 - 精准匹配原默认值的记录更新:避免覆盖用户已自定义的
user字段内容。 - 执行迁移:终端运行
rake db:migrate(Rails 4.2使用rake命令,而非Rails 5+的rails命令)。
内容的提问来源于stack exchange,提问作者Priyanshu0007
相关产品推荐
相关产品推荐

