Подтвердить что ты не робот

Как добавить настраиваемый фильтр в Active Admin?

Active Admin позволяет мне определять фильтры, которые отображаются на индексной странице следующим образом:

ActiveAdmin.register Promo do

  filter :name
  filter :address
  filter :city
  filter :state
  filter :zip

end

Я хотел бы объединить все поля выше в один, чтобы я мог искать Promos, содержащие строку поиска по имени или полному адресу. Моя модель уже имеет именованный объект, который я могу использовать:

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
4b9b3361

Ответ 1

Active Admin использует meta_search для своих фильтров. Синтаксис условий ORed позволяет комбинировать несколько полей в одном запросе, например

Promo.metasearch(:name_or_address_contains => 'brooklyn')

В Active DSL DS это означает

ActiveAdmin.register Promo do

  filter :name_or_address, :as => :string

end

Ответ 2

Active admin использует метапоиск. Например, вы можете сделать это:

filter :"subscription_billing_plan_name" , :as => :select, :collection => BillingPlan.all.map(&:name)

Ответ 3

Чтобы использовать настраиваемый фильтр, вы можете создать функцию области видимости и добавить ее в качестве параметров search_methods в модели.

Например, в моей модели User:

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 ]

Ответ 4

Я нашел лучший способ сделать это. Вам просто нужно добавить:

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 и т.д.

Ответ 5

У меня есть модель WithdrawalRequest, которая принадлежит модели Пользователь.

Для фильтрации запросов на снятие писем электронной почты нужно написать:

filter :user_id, :as => :select, :collection => User.all.map {|user| [user.email, user.id]}