[英]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.