Rails: проверка запросов с типом json - PullRequest
0 голосов
/ 18 сентября 2018

Я использую аудированный гем в своем приложении с базой данных PostgreSQL, и я хотел бы иметь возможность запрашивать атрибут :audited_changes для всех записей с изменением :program_status.Само изменение не имеет значения, я хотел бы, чтобы все проверки включали изменения в :program_status.

Примеры аудита:

#<Audit:0x007ff31789de80
  id: 11283,
  auditable_id: 2225,
  auditable_type: "Client",
  associated_id: nil,
  associated_type: nil,
  user_id: nil,
  user_type: nil,
  username: nil,
  action: "update",
  audited_changes: {"program_status"=>["full maintenance", "active"]},
  version: 21,
  comment: nil,
  remote_address: "::1",
  request_uuid: "a5a6a9f0-302a-443b-b09a-fd466557f757",
  created_at: Thu, 12 Jul 2018 17:49:40 EDT -04:00>

#<Audit:0x007ff31789de80
  id: 11284,
  auditable_id: 2226,
  auditable_type: "Client",
  associated_id: nil,
  associated_type: nil,
  user_id: nil,
  user_type: nil,
  username: nil,
  action: "update",
  audited_changes: {"program_status"=>["inactive", "active"]},
  version: 21,
  comment: nil,
  remote_address: "::1",
  request_uuid: "a5a6a9f0-302a-443b-b09a-fd466557f757",
  created_at: Thu, 12 Jul 2018 17:49:40 EDT -04:00>

#<Audit:0x007ff31789de80
  id: 11284,
  auditable_id: 2226,
  auditable_type: "Client",
  associated_id: nil,
  associated_type: nil,
  user_id: nil,
  user_type: nil,
  username: nil,
  action: "update",
  audited_changes: {"program_status"=>["full_maintenance", "limited_maintenance"]},
  version: 21,
  comment: nil,
  remote_address: "::1",
  request_uuid: "a5a6a9f0-302a-443b-b09a-fd466557f757",
  created_at: Thu, 12 Jul 2018 17:49:40 EDT -04:00>

Кажется, я бынужно использовать вариант ['{"a": {"b":"foo"}}'::json->'a'][2], я просто не уверен, как его использовать в рельсах.

1 Ответ

0 голосов
/ 18 сентября 2018

Какую базу данных вы используете?Если вы используете MySQL, поле базы данных на самом деле будет сериализованным текстовым столбцом, поэтому вы можете использовать что-то вроде

.where('audited_changes LIKE "%program_status%"')

Если вы используете Mongo, что-то вроде

.where(audited_changes: {program_status: '$exists'})

Если вы используетеPostreSQL Я думаю, что он поддерживает типы данных json, я думаю, что у него есть определенный синтаксис для запроса таких полей.

РЕДАКТИРОВАТЬ: для postgres

.where('audited_changes ? array[:keys]', keys: ['program_status'])

(проверьте таблицу 9-41 для ИЛИи операции И, если вам нужно более одной клавиши https://www.postgresql.org/docs/9.4/static/functions-json.html)

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