Оволодіння власними фільтрами в Active Admin для застосунків на Rails

Вступ:

Active Admin — це потужна адміністративна платформа для застосунків Ruby on Rails, яка спрощує процес створення надійних та налаштовуваних адміністративних інтерфейсів. Одна з його ключових можливостей — це здатність легко створювати та застосовувати власні фільтри, що дозволяє адміністраторам ефективно керувати та аналізувати дані. У цьому блозі ми дослідимо можливості власних фільтрів в Active Admin, розглянемо їх потенціал та продемонструємо, як використовувати їх для покращення адміністративних можливостей вашого застосунку Rails.

Розуміння фільтрів Active Admin:

Active Admin поставляється з вбудованими фільтрами, які допомагають користувачам швидко шукати та фільтрувати записи за конкретними критеріями. Однак є ситуації, коли стандартних фільтрів недостатньо. Тут на допомогу приходять власні фільтри. Власні фільтри дозволяють створювати індивідуальні параметри пошуку та фільтрації, що відповідають унікальним вимогам вашого застосунку.

Створення простого власного фільтра:

Почнемо з того, як створити простий власний фільтр для уявної моделі "Product". Припустимо, ми хочемо фільтрувати продукти за їх статусом доступності, з опціями "В наявності" та "Немає в наявності".

# app/admin/product.rb  

ActiveAdmin.register Product do  
  filter :name  
  filter :price  
  filter :availability, as: :select, collection: ["В наявності", "Немає в наявності"]  

  # Інші налаштування та дії...  
end

У цьому прикладі ми додали власний фільтр для атрибута "availability", що дозволяє адміністраторам фільтрувати продукти залежно від того, чи є вони в наявності.

Використання Ransack для розширених фільтрів:

Active Admin використовує бібліотеку Ransack для обробки пошуку та фільтрації. Ransack надає потужний інтерфейс запитів для ActiveRecord, що дозволяє виконувати складні пошуки з легкістю. Розглянемо, як використовувати Ransack для створення більш складних власних фільтрів.

# app/admin/product.rb  

ActiveAdmin.register Product do  
  filter :name  
  filter :price  
  filter :availability, as: :select, collection: ["В наявності", "Немає в наявності"]  

  # Власний фільтр за допомогою Ransack  
  filter :created_at_gteq, label: 'Створено після', as: :date_range  
  filter :category_id_in, label: 'Категорії', as: :select, collection: Category.all.map { |c| [c.name, c.id] }  

  # Інші налаштування та дії...  
end

У цьому прикладі ми додали фільтр діапазону дат для продуктів, створених після певної дати, а також фільтр для продуктів, що належать до вибраних категорій. Можливості запитів Ransack надають гнучке та розширюване рішення для обробки різних вимог до фільтрації.

Інтеграція сторонніх бібліотек:

Active Admin підтримує інтеграцію зі сторонніми JavaScript бібліотеками для покращення досвіду фільтрації. Розглянемо інтеграцію бібліотеки Select2 для більш зручного багатофункціонального фільтра.

# app/admin/product.rb  

ActiveAdmin.register Product do  
  filter :name  
  filter :price  
  filter :availability, as: :select, collection: ["В наявності", "Немає в наявності"]  

  # Власний фільтр за допомогою Ransack та Select2  
  filter :category_id_in,  
    label: 'Категорії',  
    as: :select,  
    collection: Category.all.map { |c| [c.name, c.id] },  
    input_html: { class: 'select2', multiple: true }  

  # Інші налаштування та дії...  
end

У цьому прикладі опція input_html використовується для вказівки додаткових HTML атрибутів для елемента вводу фільтру. Це включає клас select2, що активує бібліотеку Select2 для більш інтерактивного та зручного багатофункціонального фільтра.

Два рівні вкладеності:

Якщо ваш застосунок Rails містить складні асоціації з двома рівнями вкладеності, Active Admin надає потужне рішення для створення власних фільтрів, що відповідають вашим вимогам.

Приклад на практиці:

Давайте розглянемо практичний приклад з використанням моделі ProductItem, яка має два рівні вкладеності, а саме продукт і користувач.

Припустимо, у вас є наступна структура моделей:

class ProductItem < ApplicationRecord  
  belongs_to :product  
end  

class Product < ApplicationRecord  
  belongs_to :user  
  has_many :product_items, dependent: :destroy  
end  

class User < ApplicationRecord  
  has_many :products, dependent: :destroy  
end

Тепер налаштуємо власні фільтри в Active Admin для цього випадку:

# app/admin/product_item.rb  

ActiveAdmin.register ProductItem do  
  filter :product_invoice_number_cont, as: :string, label: 'Номер рахунку продукту'  
  filter :product_user_name_cont, as: :string, label: 'Ім’я клієнта'  

  index do  
    # Ваш код для відображення списку тут  
  end  
end

У цьому прикладі:

  • product_invoice_number_cont припускає, що product — це перша асоціація.
  • product_user_name_cont припускає, що user вкладений у product, а name — це атрибут у вкладеній асоціації user.

Налаштуйте імена фільтрів, виходячи з фактичних імен асоціацій та атрибутів. Згідно з конвенцією, імена асоціацій з’єднуються через підкреслення (_), а потім додається ім’я атрибута з суфіксом _cont.

Висновок:

Власні фільтри в Active Admin надають потужний механізм для налаштування адміністративного інтерфейсу відповідно до специфічних потреб вашого застосунку Rails. Незалежно від того, чи потрібні вам прості фільтри у вигляді випадаючих списків, чи складні можливості пошуку, Active Admin у поєднанні з Ransack та іншими сторонніми бібліотеками пропонує гнучке та розширюване рішення. Оволодівши власними фільтрами, ви надаєте адміністраторам ефективні інструменти для управління та аналізу даних, що в результаті покращує загальну зручність і ефективність адміністративного інтерфейсу.

Перекладено з: Mastering Custom Filters in Active Admin for Rails Applications