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