这是表结构
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
答案 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:%'")
这可能适用于你的情况。
此外,您还需要一个快速查询的全文搜索索引。