Кастомний фільтр в Active Admin — Частина 2

AA використовує ransack для фільтрів, тому ми можемо визначити власну область (scope) та додати її до ransack для створення кастомного фільтра. Цей підхід є корисним, коли у вас є вкладені зв’язки або коли модель не має прямого зв’язку.

Створіть файл у розділі model concerns та імпортуйте його в модель, в якій ви хочете використовувати фільтр.

_module_ CompanyCustomFilter  
_extend_ ActiveSupport::Concern
COMPANY_FILTER_CONDITIONS = [:contains, :equals, :starts_with, :ends_with]  

_included do_  
  COMPANY_FILTER_CONDITIONS.each _do_ |condition_type|  
    _self_._scope_ "company_#{condition_type}", lambda { |user_input|  
      merge Company.ransack("name_#{condition_type}" => user_input).result  
    }  
  _end  
_end  

  def self_ .ransackable_scopes(auth_object = _nil_)  
    COMPANY_FILTER_CONDITIONS.map _do_ |k|  
      "company_#{k}".to_sym  
    _end_  
  _end  

  def self_  
    .ransackable_scopes_skip_sanitize_args  
    COMPANY_FILTER_CONDITIONS.map _do_ |k|  
      "company_#{k}".to_sym  
    _end_  
  _end  
_end_class Product < ApplicationRecord   
  include CompanyCustomFilter  
end

Додайте нижченаведений код у файл app/admin, в якому ви хочете застосувати кастомний фільтр.

filter :company, label: 'Company name', as: :string

Цей фільтр застосовуватиме чотири типи умов, які визначені у concern.

Успіхів!

Перекладено з: Custom Filter in Active Admin — Part 2