0

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)に関連付けられているまたは関連付けられていないすべての親リソースを取得したい。悪くはありませんが、たとえば最初のフィルターで2つの子を選択すると、アクティブな管理者は最初の子または2番目の子に関連付けられているすべての親リソースを返します。両方(:child_idと:child_id_not)に「AND」演算子が必要です。

回避策はありますか?

4

1 に答える 1

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
于 2012-11-28T22:37:14.117 に答える