有什么办法可以用db postgres查询rails中的文本

时间:2016-10-25 08:37:39

标签: ruby-on-rails postgresql ruby-on-rails-4 acts-as-audited

这是表结构

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,它存储为序列化哈希。

找到一个参考,我们可以在文本Searching serialized data, using active record中查询序列化数组,我是否有任何类似于查询的选项而不是循环大量的记录?

这就是我从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

1 个答案:

答案 0 :(得分: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:%'")

这可能适用于你的情况。

此外,您还需要一个快速查询的全文搜索索引。