Активный админ "И" фильтр с флажками
У меня есть простой фильтр активного администратора в моем Parent
ресурс:
filter :child_id, :as => :check_boxes, :collection => proc { Child.all }
filter :child_id_not, :as => :check_boxes, :collection => proc { Child.all }
Я хочу получить все родительские ресурсы, которые связаны или не связаны с дочерним ресурсом (has_and_belongs_to_many). Работает неплохо, но когда я выбираю, например, двух дочерних элементов в первом фильтре, активный администратор возвращает все родительские ресурсы, которые связаны с первым ИЛИ вторым. Мне нужен оператор "И" для обоих (:child_id и:child_id_not).
Есть обходные пути?
1 ответ
Решение
Вам придется выкатить свои собственные прицелы. ActiveAdmin использует meta_search для своих фильтров (https://github.com/ernie/meta_search).
В вашем админ-файле:
filter :child_id_all,
:as => :check_boxes,
:collection => proc { Child.all }
filter :child_id_all_not,
:as => :check_boxes,
:collection => proc { Child.all }
В вашей родительской модели:
scope :child_id_all_in, -> ids {
ids.reduce(scoped) do |scope, id|
subquery = Parent.select('`parents`.`id`').
joins(:childs).
where('`childs`.`id` = ?', id)
scope.where("`parents`.`id` IN (#{subquery.to_sql})")
end
}
scope :child_id_all_not_in, -> ids {
ids.reduce(scoped) do |scope, id|
subquery = Parent.select('`parents`.`id`').
joins(:childs).
where('`childs`.`id` = ?', id)
scope.where("`parents`.`id` NOT IN (#{subquery.to_sql})")
end
}
search_methods :child_id_all_in
search_methods :child_id_all_not_in