Есть ли способ я могу запросить текст в рельсах с помощью 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:%'")
Это, вероятно, будет работать в вашем случае.
Также вам нужен индекс для полнотекстового поиска для быстрого запроса.