【问题标题】:Is there any way I can query a text in rails with db postgres有什么方法可以使用 db postgres 查询 rails 中的文本
【发布时间】:2016-10-25 08:37:39
【问题描述】:

这是表结构

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

【问题讨论】:

  • 一定要使用serialize吗?这是一个可怕的 hack,在数据库中解析 YAML 将是一团糟。
  • Ya @muistooshort 这是一个 gem 概念,我现在无法更改,因为数据库已经有超过 5 万条记录

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


【解决方案1】:

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

假设有两条记录:

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-03-18
  • 2016-05-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
相关资源
最近更新 更多