Есть ли способ я могу запросить текст в рельсах с помощью db postgres

Вот структура таблицы

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

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:%'")

Это, вероятно, будет работать в вашем случае.

Также вам нужен индекс для полнотекстового поиска для быстрого запроса.

Другие вопросы по тегам