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

the*_*ish 2 ruby postgresql json ruby-on-rails

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

string  "name"
integer "line_id"
json    "filters"
Run Code Online (Sandbox Code Playgroud)

其中filters字段包含带有嵌套键的 json 对象。我想修改特定的键而不覆盖 json 的其余部分。

目前,存储的 json 对象filters如下所示

{
  "ext": {"name": "filter", "id": 3},
  "int": {"name": "numb", "id": 1}
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将int.name的值更新为 ,"remove"而不修改 json 对象的其余部分。

如果我执行以下操作,它将简单地覆盖整个 json 对象,而不是修改该特定键:

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

如何简单地用路径更新该一个键int.name,同时保持其余属性相同?

and*_*w21 6

您使用的是哪个版本的 Rails?如果您使用的是 Rails 5,您应该能够

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

这将保留现有的哈希键。

我认为使用 Rails 4,您在现场需要一个 json 序列化器,但我相信,一旦您拥有序列化器,应该以相同的方式工作。