You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:15:43