0

这是表结构

create_table :audits, :force => true do |t|
    t.column :audited_changes, :text
end

class Audit < ::ActiveRecord::Base
    serialize :audited_changes, Hash
end

这是来自 gem Audited gem 的一堆代码,我需要在其中查询存储为序列化哈希的文本字段 audited_changes。

找到了一个参考,我们可以在文本中查询序列化数组搜索序列化数据,使用活动记录,我有没有类似于查询而不是循环大量记录的选项?

这就是我从 audited_changes 中取出我需要的记录的方式

fields = ['name', 'description']
audit_data = audit_data.select do |obj|
    obj.define_singleton_method(:audited_changes_filtered) do
        obj.audited_changes.select {|k,v| fields.map(&:to_s).include?(k) }
    end
    obj if fields_present?(obj, fields)
end
4

1 回答 1

0

查询序列化文本列的原始内容(可能仅在某些情况下有效)

假设有两条记录:

Audit.create(audited_changes: {'key1' => 'value1', 'key2' => 'value2'})
Audit.create(audited_changes: {'key3' => 'value3', 'key4' => 'value4'})

检查它在 psql 中的外观(值如何存储在 PostgreSQL 中):

SELECT * FROM audits;
 id | audited_changes 
----+-----------------
  1 | ---            +
    | key1: value1   +
    | key2: value2   +
    | 
  2 | ---            +
    | key3: value3   +
    | key4: value4   +
    | 
(2 rows)

所以在 YAML 中序列化的值

使用键key3查询文本列的原始内容以搜索记录:

Audit.where("audited_changes LIKE '%\nkey3:%'")

这可能适用于您的情况。

您还需要一个用于全文搜索的索引以进行快速查询。

于 2016-10-25T12:10:35.307 回答