@Ivan Shamatov发布的答案非常有效,尤其对于处理大型数据库时要保持良好的性能。
我在PostgreSQL数据库上尝试了它,在jsonb列上。
为了让它正常工作,我们必须同样注意数据类型转换。
例如,在像这样的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"
}
to:
{
"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类型转换!
column
在数据库中吗?(即,这个哈希值是否已序列化?)还是你只是在内存中进行操作? - Kyle d'Oliveira