Rails Model - обновить вложенный ключ / значение в JSON - PullRequest
0 голосов
/ 24 мая 2018

У меня есть модель со следующим форматом таблицы:

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

Где поле filters содержит объект json с вложенными ключами.Я хочу изменить определенный ключ без перезаписи остальной части json.

В настоящее время объект json, сохраненный в filters, выглядит как

{
  "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, оставив остальные атрибуты такими же?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

какую версию рельсов вы используете?если вы используете rails 5, вы сможете

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

, чтобы существующие хеш-ключи оставались на месте.

Я думаю, что для rails 4 вам понадобится сериализатор json наполе, но должно работать так же, как только у вас есть сериализатор, я считаю.

0 голосов
/ 24 мая 2018

Как на счет этого

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 или Hash, которое будет преобразовано в JSONдо вставки, но оператор обновления будет похож на

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

При этом используется ActiveRecord::Relation#update, где первый Array - это идентификаторы для обновления, а второй Array - это новыйзначения, чтобы связать с этими идентификаторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...