簡體   English   中英

Rails模型-更新JSON中的嵌套鍵/值

[英]Rails Model - Update Nested Key/Value in JSON

我有一個具有以下表格格式的模型:

string  "name"
integer "line_id"
json    "filters"

其中filters字段包含帶有嵌套鍵的json對象。 我想修改一個特定的鍵而不覆蓋json的其余部分。

當前,存儲在filters的json對象看起來像

{
  "ext": {"name": "filter", "id": 3},
  "int": {"name": "numb", "id": 1}
}

我試圖將int.name的值更新為"remove"而不修改json對象的其余部分。

如果執行以下操作,它將簡單地覆蓋整個json對象,而不是修改該特定鍵:

Model.where("filters->>'int'->>'name' IS NOT NULL").update(
  filters: {
    int: {
      name: "remove"
    }
  }
)

如何在保持其余屬性不變的情況下,簡單地使用路徑int.name更新該鍵?

您正在使用哪個版本的rails? 如果您使用的是Rails 5,則應該能夠

m = Model.where("filters->>'int'->>'name' IS NOT NULL").first
m.filters['name'] = 'remove'
m.save

這將保留現有的哈希鍵。

我認為在Rails 4上,您需要在現場使用json序列化程序,但我相信,一旦有了序列化程序,就應該以相同的方式工作。

這樣的事情怎么樣

models = Model.where("filters->>'int'->>'name' IS NOT NULL")
  .each_with_object({}) do |m,obj|
    # credit to mudasobwa for the tap usage 
    obj[m.id] = {filters: m.filters.tap { |h| h['int']['name'] = 'remove' } }
  end 
Model.update(models.keys,models.values)

我從未使用過json列,所以我不確定預期值是JSON還是要在插入之前將其轉換為JSON的Hash ,但update語句類似於

Model.update([1],[{
         "ext"=> {"name"=> "filter", "id"=> 3},
         "int"=> {"name"=> "remove", "id"=> 1}
       }])

這使用ActiveRecord::Relation#update ,其中第一個Array是要更新的ID,第二個Array是要與這些ID關聯的新值。

暫無
暫無

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

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