Вітання всім 🙌. У цій статті я розгляну популярний Ruby gem Ransack, який спрощує управління даними в Rails, і поділюся деякими порадами щодо оптимізації процесу фільтрації.
Що таке Ransack?
https://avatars.githubusercontent.com/u/5951504?s=200&v=4
Ransack — це популярний Ruby gem, який використовується в Ruby on Rails проєктах. Він призначений для спрощення роботи з запитами до бази даних та надання зручних функцій пошуку для користувачів. Ransack допомагає спростити складні запити в додатках на основі Active Record.
[
GitHub - activerecord-hackery/ransack: Пошук на основі об'єктів.
Пошук на основі об'єктів. Підтримка розробки Ransack на GitHub.
github.com
](https://github.com/activerecord-hackery/ransack?source=post_page-----4db2d6824b61---------------------------------------)
Сфери застосування та переваги Ransack
Ransack особливо корисний для великих баз даних і складних запитів у Rails додатках. Завдяки цьому gem'у, розробники та кінцеві користувачі можуть здійснювати детальні та гнучкі запити до таблиць бази даних. Серед переваг Ransack можна виділити можливості для користувацьких запитів, динамічне формування запитів, сортування та групування, легку інтеграцію та розширюваність.
Звісно, є й деякі недоліки:
- Крива навчання: Щоб повною мірою використовувати можливості Ransack, розробникам слід вивчити, як правильно користуватися цим gem'ом.
- Проблеми з продуктивністю: Неправильне використання або робота з великими наборами даних можуть призвести до проблем з продуктивністю. Тому важливо використовувати Ransack ефективно.
Типи запитів (Predicates) та їх використання
Для додаткової інформації: Search Matchers | Документація Ransack
Як використовувати в нашому Rails проєкті?
Ransack — потужний інструмент для фільтрації та запитів даних в Ruby on Rails проєктах. Його інтеграція дуже проста, і ви можете швидко почати використовувати його в своїх проєктах.
gem 'ransack'
Приклад коду Rails:
class BooksController < ApplicationController
def index
@search = current_user.books.ransack(params[:q])
@data = @search.result
end
end
Приклад запиту:
curl --location --globoff 'http://localhost:3000/books?q[name_eq]=example_name' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
У наведеному прикладі ми хочемо відфільтрувати книги, що належать користувачу, за значенням name
, яке дорівнює examplename_.
Ransack забезпечує динамічне фільтрування на основі параметра (params[:q]
).
Bu şekilde, verilerinizi istemci taleplerine göre esnek bir şekilde filtreleyebilir ve sonuçları alabiliriz.
Bazı İstek Örnekleri
eq
(Eşitlik):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_eq]=example_name' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
not_eq
(Eşit Olmama):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_not_eq]=example_name' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
lt
(Küçüktür):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[age_lt]=30' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
lteq
(Küçük veya Eşittir):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[age_lteq]=30' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
gt
(Büyüktür):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[age_gt]=30' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
gteq
(Büyük veya Eşittir):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[age_gteq]=30' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
present
(Dolu):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_present]=1' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
blank
(Boş)
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_blank]=1' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
veya
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_blank]=0' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
null
(Null)
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_null]=1' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
not_null
(Null Değil)
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_not_null]=1' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
in
(Belirli Bir Dizi İçinde):
curl --location --globoff 'http://localhost:3000/api/v
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
not_in
(Belirli Bir Dizi İçinde Değil)
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[age_not_in][]=25&q[age_not_in][]=30' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
matches
(Pattern ile Eşleşme):
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_matches]=%example%' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
does_not_match
(Pattern ile Eşleşmeme)
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[name_does_not_match]=%example%' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'
## `between` (В межах певного діапазону)
curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[agebetween][]=20&q[age_between][]=30' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOURTOKEN'
```
Результат
У цій статті я зосередився на гемі Ransack, який спрощує фільтрацію та запити даних у проектах Ruby on Rails.
Ransack призначений для спрощення складних запитів і забезпечення зручних функцій пошуку для користувачів. Цей гем відіграє важливу роль у проектах, що мають великі бази даних та складні вимоги до запитів.
Серед переваг, які надає Ransack, є гнучкість, розширюваність та легка інтеграція. Проте існують і деякі недоліки, такі як крива навчання та проблеми з продуктивністю. Щоб мінімізувати ці недоліки, слід правильно використовувати гем і оптимізувати запити.
Зрештою, гем Ransack є потужним інструментом для оптимізації фільтрації та запитів даних у проектах Ruby on Rails.
Джерела:
[
GitHub - activerecord-hackery/ransack: Object-based searching.
Object-based searching. . Contribute to activerecord-hackery/ransack development by creating an account on GitHub.
github.com
](https://github.com/activerecord-hackery/ransack?source=post_page-----4db2d6824b61---------------------------------------)
[
Introduction | Ransack documentation
Ransack допоможе вам легко додати пошук до вашого додатку Rails без додаткових залежностей.
activerecord-hackery.github.io
](https://activerecord-hackery.github.io/ransack/?source=post_page-----4db2d6824b61---------------------------------------)
Перекладено з: Ruby on Rails’da Filtreleme: Ransack Gem’i Kullanımı İpuçları