簡體   English   中英

Active Record 更新所有 JSON 字段

[英]Active Record Update All JSON Field

所以我有一個模型Item ,它有一個巨大的 postgresql JSON 字段,稱為properties 大多數時候不需要查詢或更改此字段,但是我們將price存儲在此字段中。

我目前正在編寫一個更新這個price的腳本,但是只有幾個唯一的prices和數千個Items ,所以為了節省時間,我有一個每個唯一priceItems列表,我正在嘗試全部更新:

Item.where(id: items).update_all("properties->>'price' = #{unique_price}")

但這給了我:

syntax error at or near "->>"

有沒有辦法使用 update all 來更新 postgres JSON 字段中的字段?

您需要使用jsonb_set()函數,這是一個示例

Item.where(id: items).
     update_all(
       "properties = jsonb_set(properties, '{price}', to_json(#{unique_price}::int)::jsonb)"
     )

這將保留所有值並僅更新一個鍵。

閱讀 文檔

你也可以這樣做

Item.where(id: items).each do |item|
  properties = item.properties
  item.update(properties: properties.merge({
    price: unique_price
  }))
end

關鍵字merge將覆蓋與新值一起提供的鍵的值,即 unique_price

合並文檔在這里

我根據@Philidor 的建議提出的想法非常相似,但具有動態綁定:

assignment = ["field = jsonb_set(field, '{ name_of_the_key }', ?)", value.to_json]
scope.update_all(scope.model.sanitize_sql_for_assignment(assignment))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM