如何将 ActiveRecord 模型属性从 json 迁移到 jsonb?

How do I migrate an ActiveRecord model attribute from json to jsonb?

迁移应该是什么样的?我想利用 jsonb 数组查询技术。

我会这样写迁移:

def change
  reversible do |dir|
    dir.up { change_column :models, :attribute, 'jsonb USING CAST(attribute AS jsonb)' }
    dir.down { change_column :models, :attribute, 'json USING CAST(attribute AS json)' }
  end
end

我不知道这在性能方面与其他解决方案相比如何,但我在具有 120,000 条记录的 table 上测试了它,每条记录有四个 json 列,这花了我大约花一分钟时间迁移 table。当然,我猜这取决于 json 结构的复杂程度。

此外,请注意,如果您现有的记录具有默认值 {},您必须添加上述语句 default: {},否则您将拥有 jsonb 列, 但默认值将保持为 '{}'::json.