Ruby on Rails’da Filtreleme: Ransack Gem’i Kullanımı İpuçları

Ahmet Kaptan
Passgage Tech
Published in
4 min readFeb 11, 2024

Herkese selamlar 🙌 . Bu makalede, Rails’da veri yönetimini kolaylaştıran Ransack gem’ine değineceğim ve filtreleme süreçlerini optimize etmek için bazı ipuçları ve püf noktalarını paylaşacağım.

Ransack Nedir?

https://avatars.githubusercontent.com/u/5951504?s=200&v=4

Ruby on Rails projelerinde kullanılan popüler bir Ruby gem’idir. Veritabanı sorgularını kolaylaştırmak ve kullanıcı dostu arama işlevleri sağlamak için tasarlanmıştır. Ransack, Active Record tabanlı uygulamalarda karmaşık sorguları basitleştirmeye yarar.

Ransack’in Kullanım Alanları ve Avantajları

Özellikle büyük ölçekli veritabanları ve karmaşık sorgulama gereksinimlerine sahip Rails uygulamalarında kullanılır. Bu gem sayesinde, geliştiriciler ve son kullanıcılar, veritabanı tabloları üzerinde detaylı ve esnek sorgular yapabilirler. Ransack’in sunduğu avantajlar arasında kullanıcı tabanlı sorgulama, dinamik sorgu oluşturma, sıralama ve gruplama yetenekleri, kolay entegrasyon ve genişletilebilirlik bulunmaktadır.

Tabii bazı dezavantajları da mevcut. Bunlar:

  1. Öğrenme Eğrisi: Ransack’in tam potansiyelinden yararlanmak için geliştiricilerin gem’in nasıl kullanılacağını öğrenmeleri gerekebilir.
  2. Performans Sorunları: Yanlış kullanıldığında veya çok büyük veri kümeleriyle çalışırken, Ransack’in performans sorunlarına neden olabileceği durumlar olabilir. Bu nedenle, verimli bir şekilde kullanılması önemlidir.

Sorgu Türleri (Predicates) ve Kullanımları

Daha fazlası için: Search Matchers | Ransack documentation

Rails Projemizde Nasıl Kullanıyoruz?

Ransack, Ruby on Rails projelerinde veri filtreleme ve sorgulama işlemlerini kolaylaştıran güçlü bir araçtır. Entegrasyonu oldukça basittir ve projelerimizde hızlıca kullanmaya başlayabiliriz.

gem 'ransack'

Örnek Rails Kodumuz:

class BooksController < ApplicationController
def index
@search = current_user.books.ransack(params[:q])
@data = @search.result
end
end

Örnek İsteğimiz:

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'

Yukarıdaki örneğimizde User’a bağlı kitaplar arasında name değeri example_name değerine eşit kitapları filtrelemek istiyoruz.

Ransack, (params[:q]) dayalı olarak dinamik bir filtreleme işlemi sağlar. 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/v1/deneme?q[age_in][]=25&q[age_in][]=30' \
--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 (Belirli Bir Aralıkta)

curl --location --globoff 'http://localhost:3000/api/v1/deneme?q[age_between][]=20&q[age_between][]=30' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_TOKEN'

Sonuç

Bu makalede, Ruby on Rails projelerinde veri filtreleme ve sorgulama işlemlerini kolaylaştıran Ransack gem’i üzerinde durdum. Ransack, karmaşık sorguları basitleştirmek ve kullanıcı dostu arama işlevleri sağlamak için tasarlanmıştır. Bu gem, büyük ölçekli veritabanları ve karmaşık sorgulama gereksinimlerine sahip projelerde önemli bir rol oynamaktadır.

Ransack’in sunduğu avantajlar arasında esneklik, genişletilebilirlik ve kolay entegrasyon yer alır. Ancak, kullanımıyla ilgili bazı dezavantajlar da mevcuttur, örneğin öğrenme eğrisi ve performans sorunları gibi. Bu dezavantajları minimize etmek için, gem’in doğru şekilde kullanmaya ve sorguları optimize etmeye özen göstermeliyiz.

Sonuç olarak, Ransack gem’i Ruby on Rails projelerinde veri filtreleme ve sorgulama işlemlerini optimize etmek için güçlü bir araçtır.

--

--