Пользовательский поиск с ransacker
Я пытаюсь добавить настраиваемый фильтр в ActiveAdmin, который в настоящее время работает на Ransack. К сожалению, ransacker
не документируется вообще, и из нескольких ресурсов в сети я объединил следующее (в модели User):
ransacker :full_text, formatter: ->(search) {
ids = User.search_in_all_translated(search).map(&:id)
ids = ids.any? ? ids : nil
} do |parent|
parent.table[:id]
end
Метод search_in_all_translated
возвращает массив пользователей, которые соответствуют строке поиска по всем переведенным атрибутам.
На странице администратора определяется следующий фильтр:
filter :full_text_in,
label: 'full text search',
as: :string
Сам фильтр работает, поэтому фильтрация tom
будет отображать все соответствующие записи. Однако значение входного сигнала фильтра переключается на ["tom"]
.
Перед применением фильтра:
![enter image description here]()
После применения фильтра:
![enter image description here]()
Любые идеи, как это исправить?
Ответы
Ответ 1
Есть функция для ransackable областей, ожидающих объединения:
https://github.com/activerecord-hackery/ransack/pull/288
UPDATE:
Я дал работу avit и glebm еще раз с PR https://github.com/activerecord-hackery/ransack/pull/390, который был объединен, поэтому теперь можно использовать области с Ransack. Для документации см. Фиксацию:
https://github.com/svoop/ransack/commit/72dd5d12d58919bf37199234cf13f9533f3b8cd5
Вот пример реальной жизни:
class Project < ActiveRecord::Base
scope :full_text_search, ->(search) { search_in_all_translated(search) }
def self.ransackable_scopes(auth_object = nil)
[:full_text_search]
end
end
В этом примере search_in_all_translated
возвращает некоторый сложный индексированный полнотекстовый поиск SQL.
Ответ 2
in
или cont_any
выполните поиск через массив. Таким образом, в этом случае он выполняет поиск Model.where(something: ["tom", "tom1", "tom2"]
и из-за того, как работает params [: q], он возвращает его на ваш вход в виде массива. Быстрое и грязное исправление, которое я сделал для удобства пользователей, добавлено value: nil,
в форму ввода