带有复选框的活动管理员“AND”过滤器

时间:2012-11-19 16:13:00

标签: filter activeadmin meta-search

我的Parent资源中有简单的有效管理过滤器:

filter :child_id, :as => :check_boxes, :collection => proc { Child.all }
filter :child_id_not, :as => :check_boxes, :collection => proc { Child.all }

我想获取与Child资源(has_and_belongs_to_many)相关或不相关的所有Parent资源。工作不错,但是当我在第一个过滤器中选择两个孩子时,活动管理员返回与第一个或第二个相关联的所有父资源。我需要“AND”运算符(:child_id和:child_id_not)。

有任何解决方法吗?

1 个答案:

答案 0 :(得分:3)

您必须推出自己的范围。 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