Active Adminを使用すると、 define filters がインデックスページに次のように表示されます。
ActiveAdmin.register Promo do
filter :name
filter :address
filter :city
filter :state
filter :Zip
end
上記のすべてのフィールドを1つに結合して、名前または完全なアドレスに検索文字列を含むプロモを検索できるようにします。私のモデルには既に使用可能な名前付きスコープがあります:
class Promo < ActiveRecord::Base
scope :by_name_or_full_address, lambda { |q| where('name LIKE :q OR address LIKE :q OR city LIKE :q OR state LIKE :q OR Zip LIKE :q', :q => "%#{q}%") }
end
Active Adminは、フィルターに meta_search gemを使用します。 ORされた条件構文により、たとえば、1つのクエリで複数のフィールドを結合できます。
Promo.metasearch(:name_or_address_contains => 'brooklyn')
Active Admin DSLでは、これは
ActiveAdmin.register Promo do
filter :name_or_address, :as => :string
end
アクティブな管理者はメタサーチを使用します。たとえば、これを行うことができます:
filter :"subscription_billing_plan_name" , :as => :select, :collection => BillingPlan.all.map(&:name)
カスタムフィルターを使用するには、スコープ関数を作成し、モデルにsearch_methodsとして追加します。
たとえば、私のユーザーモデルでは:
search_methods :role_eq
scope :role_eq, -> (role) { where("? LIKE ANY(roles)", role) }
次に、users.rbで、スコープをカスタムフィルターとして使用できます。
filter :role, label: "Roles", as: :select, collection: %w[ student teacher parent ]
もっと良い方法を見つけました。追加するだけです:
config.clear_sidebar_sections!
sidebar :filters do
render partial: 'search'
end
そして、_search
パーシャル内で、ビルダーActiveAdmin::FormBuilder
でフォームを作成します。
https://github.com/gregbell/active_admin/blob/master/lib/active_admin/filters/forms.rb
方法の詳細については、この要点をご覧ください。
https://Gist.github.com/4240801
別のアイデアは、クラスを作成することです:
module ActiveAdmin
module Inputs
class FilterCustomStringInput < FilterStringInput
def input_name
"#{super}"
end
end
end
end
as: :custom_string
で呼び出すことができますが、custom_selectなどを作成する必要があることがすぐにわかるので、私はその考えが好きではありません...
2018年の回答。ActiveAdminはRansackを使用しています。
モデル自体に、Ransackフォーマッタを追加する必要があります。
ransacker :my_custom_filter, formatter: -> (category_id) {
ids = MyModel.where(category_id: category_id).pluck(:id) # return only id-s of returned items.
ids.present? ? ids : nil # return ids OR nil!
} do |parent| # not sure why this is needed .. but it is :)
parent.table[:id]
end
ActiveAdminファイルで、ルールを指定する必要があります。
filter :my_custom_filter_in, as: :select, collection: -> { Category.all } # sometimes my_custom_filter_eq - depending on what you want .. Specify different "as" when you need it.
モデルがありますWithdrawalRequestこれはserモデルに属します。
ユーザーのメールで引き出しリクエストをフィルタリングするには、次のように書く必要があります。
filter :user_id, :as => :select, :collection => User.all.map {|user| [user.email, user.id]}
これは私のために働いた:
私のモデルで
_ scope :active, -> { where(inactive_at: nil) }
scope :inactive, -> { where.not(inactive_at: nil) }
...
ransacker :listing_status, formatter: proc{ |status|
ids = status == 'Active' ? active.ids : inactive.ids
ids = ids.present? ? ids : nil
}, splat_params: true do |parent|
parent.table[:id]
end
_
私の管理ファイル
filter :listing_status_in, as: :select, collection: %w(Active Inactive), label: 'Listing Status'