Активный админ "И" фильтр с флажками

У меня есть простой фильтр активного администратора в моем 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
Другие вопросы по тегам