@Ivan Shamatov 发布的答案效果很好,对于在大型数据库上具有良好的性能尤为重要。
我在 jsonb 列上使用 PostgreSQL 数据库进行了尝试。
为了让它工作,我们必须同样注意数据类型转换。
例如在这样的User
模型上:
User < ActiveRecord::Base {
:id => :integer,
:created_at => :datetime,
:updated_at => :datetime,
:email => :string,
:first_name => :string,
:last_name => :string,
:custom_data => :jsonb
}
custom_data
我的目标是在jsonb 字段中重命名一个键。例如custom_data
哈希内容来自:
{
"foo" => "bar",
"date" => "1980-07-10"
}
至:
{
"new_foo" => "bar",
"date" => "1980-07-10"
}
对于我的数据库中存在的所有用户记录。
我们可以执行这个查询:
old_key = 'foo'
new_key = 'new_foo'
User.update_all("custom_data = REPLACE(custom_data::text, '#{old_key}'::text, '#{new_key}'::text)::jsonb")
这只会替换我们 jsonb 散列中的目标键(old_key),而不会更改散列值或其他散列键。
注意::text
和::jsonb
类型转换!