Rails:使用json类型进行查询审核

时间:2018-09-18 16:20:32

标签: ruby-on-rails activerecord

我正在将我的应用程序中的audited gem与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]的变体,只是不确定如何在rails中使用它。

1 个答案:

答案 0 :(得分:0)

您正在使用哪个数据库?如果您使用的是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'])

(如果您需要多个键https://www.postgresql.org/docs/9.4/static/functions-json.html,请检查表9-41中的OR和AND操作)