我正在将我的应用程序中的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中使用它。
答案 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操作)