Фільтри в ActiveAdmin: Фільтрація значення Nil за допомогою Ransacker та ActiveAdmin

Нічого значить щось! …тож давайте фільтрувати це!

Ми - маленький стартап, і нам не потрібен величезний CMS з купою зайвих функцій, тому ми використовуємо ActiveAdmin, відкритий CMS. Хоча ActiveAdmin має свої недоліки (як будь-яке програмне забезпечення), він чудово підходить для наших потреб у більшості випадків. Однак одним із болючих моментів стала необхідність налаштування фільтрації поза стандартним фільтром, вбудованим у AA. У цій статті я опишу нашу ситуацію, потребу в налаштуваному фільтрі та те, як ви можете створити і протестувати власний фільтр.

TL;DR — Як створити налаштований фільтр для значень nil в ActiveAdmin, використовуючи Ransacker.

Нещодавно ми випустили нову функцію, яка дозволяє нашим користувачам створювати загальну заявку та подавати її до кількох кодувальних шкіл. Ці заявки мають низку асоціацій, одна з яких — стипендія. Модель стипендії була чимось, що можна було додати до заявки, і вона таким чином була пов’язана з користувачем/заявником. Однак ми помітили, що користувачі створювали заявки, додавали стипендію, а потім залишали свої профілі неповними. Без профілю це залишало багато значень nil в асоційованій стипендії. Ці значення, хоч і нічого не означають, проте мали значення: вони були доказом того, на якому етапі користувач припинив свою діяльність, і ми хотіли мати можливість сортувати їх, щоб отримати дані про робочий процес.

Проблема: ActiveAdmin не має вбудованого фільтра для значень nil, тільки для булевих значень.

Рішення: Створити налаштований фільтр, який надасть нам більше контролю над даними, які ми відображаємо.

Крок перший: Визначте ваш фільтр

pic

app/admin/applicationscholarship.rb_

Декілька важливих моментів. Я рекомендую, хоча це не обов'язково, використовувати ім'я стовпця, за яким ви хочете фільтрувати, у цьому випадку: ‘datereceived’. Потім ви повинні додати до цього ‘in’. Тобто, якщо ви фільтруєте за стовпцем з ім'ям avaiabletoday, ваш фільтр має називатися: availabletoday_in.

Інше, на що варто звернути увагу, це колекція, яка є двовимірним масивом. Це те, що ви будете використовувати для створення поведінки, схожої на булеву. випадаючий список на екрані AA буде заповнений першим значенням з кожного масиву і надішле друге значення кожного масиву до вашого майбутнього запиту. Випадаючий список має виглядати так:

pic

Admin View

Крок 2: напишіть метод ransacker

Тепер ми хочемо використати Ransacker (це також корисно), щоб швидко отримати потрібну інформацію, наприклад, записи з nil значеннями та записи, які не мають nil значень.

pic

app/models/applicationscholarship.rb_

Зверніть увагу, що підсвічене ім'я відповідає імені налаштованого фільтра та (не обов'язково) стовпцю, за яким ми хочемо фільтрувати. Також зверніть увагу, що значення, яке передається в proc, є другими значеннями з нашої колекції масиву в AA. Це також може бути ‘0’ і ‘1’ або будь-який інший тип a/b для створення деякої булевої поведінки (що ми перевіряємо на рядках 6 та 7). Інша важлива частина — це 'do block', який слідує за proc, у якому ви бачите змінну parent. Parent відноситься до Arel вузла, який повертається методом ransacker. Я НАСТОЯТНО рекомендую поставити брейкпоінт там (byebug, pry тощо) і подивитися, що відбувається.

Тепер давайте напишемо наші scopes. Для позитивного випадку, наприклад
будь-яке значення, яке не є nil, ми хочемо створити scope (область видимості) під назвою ‘sent_applications’, яке, як ви бачите, викликається на 6 рядку.

pic

app/models/applicationscholarship.rb_

Зверніть увагу на використання ActiveRecord’s where.not. Тобто, простими словами, дайте мені всі ApplicationScholarships, де значення sentat заявки не є nil. Тепер давайте створимо query (запит) для негативного значення, яке повертає всі ApplicationScholarships, де значення sentat заявки є nil.

pic

app/models/applicationscholarship.rb_

Тепер у нас є і негативний результат. Підсумовуючи, коли випадаючий список у AA вибрано як ‘yes’, ми передаємо значення ‘true’ до proc (процедури) методу ransacker (Ransacker) і потім виконуємо наші відповідні scopes (області видимості) ось так.

І ось вам і готово! Тепер у вас є основи для створення власних фільтрів для ActiveAdmin. Звідси ви можете досліджувати різні можливості і отримувати саме ті дані, які вам потрібні, використовуючи всі асоціації у ваших моделях ActiveRecord (ActiveRecord).

Перекладено з: Custom Filters in ActiveAdmin: Filtering a Nil Value with Ransacker and ActiveAdmin