Фільтрація в Ruby on Rails: Поради з використання геми Ransack

pic

Вітання всім 🙌. У цій статті я розгляну популярний Ruby gem Ransack, який спрощує управління даними в Rails, і поділюся деякими порадами щодо оптимізації процесу фільтрації.

Що таке Ransack?

pic

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 можна виділити можливості для користувацьких запитів, динамічне формування запитів, сортування та групування, легку інтеграцію та розширюваність.

Звісно, є й деякі недоліки:

  1. Крива навчання: Щоб повною мірою використовувати можливості Ransack, розробникам слід вивчити, як правильно користуватися цим gem'ом.
  2. Проблеми з продуктивністю: Неправильне використання або робота з великими наборами даних можуть призвести до проблем з продуктивністю. Тому важливо використовувати 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 YOUR
TOKEN'
```

Результат

У цій статті я зосередився на гемі 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ı