如何使用rails和postgres异步更新不同的json(jsonb)属性?

Min*_*ure 5 postgresql json ruby-on-rails jsonb

我在 postgres 表列中存储了一个大的 json 对象,模式的一个例子是这样的:

create_table “document” do |t|
    t.jsonb “data”, default: []
end
Run Code Online (Sandbox Code Playgroud)

目前我正在更新列中的 json,如下所示:

# find document in rails then…
doucment.data[‘some_attribute’][2][‘another_attribute’] = 100
doucment.save
Run Code Online (Sandbox Code Playgroud)

然而,我多次写入这个 json 属性,有时数据会丢失,因为如果两个调用同时写入它,那么整个对象将被保存或覆盖当前对象的旧数据。

例如,如果有两个不同的保存同时通过以下

保存1:

doucment.data[‘some_attribute’][2][‘another_attribute’] = 100
doucment.save
Run Code Online (Sandbox Code Playgroud)

保存2:

doucment.data[‘some_attribute’][2][‘different_attribute’] = 200
doucment.save
Run Code Online (Sandbox Code Playgroud)

那么其中一个属性数据将丢失,因为另一个将保存它的 json 但带有尚未刷新的旧数据。

使两个调用正确保存新数据的最佳方法是什么。

是否有任何 json 方法可以进入并更新一个属性,例如update_attribute但是对于 jsonb 属性?

dem*_*mir 5

Postgresql有这个jsonb_set方法。您可以使用此方法更新您的模型。

使用此代码,记录将在单个查询中更新:

Document.where(id: document.id).update_all(
  "data = jsonb_set(data, '{some_attribute,2,another_attribute}', to_json(#{your_int_value}::int)::jsonb)"
)
Run Code Online (Sandbox Code Playgroud)

相关postgresql文档

对我有帮助的答案