Rails Scopes: Veritabanı Sorgularını Temiz ve Hızlı Tutmanın Yolu

Rails'te scope, modellerinizde tanımlayabileceğiniz ve sorguları temiz, tekrar kullanılabilir hale getiren özel metotlardır. Scope her zaman bir ActiveRecord::Relation nesnesi döndürür, hatta koşul yanlışsa bile. Class method ise nil döndürebilir. Bu fark, sorguları zincirleyebilmen açısından önemlidir.

Scopes neden kullanmalısın? Çoğu zaman veritabanında filtreleme, tarih aralığı seçimi, sıralama veya gruplama yapman gerekir. Scope'lar bu işleri hızlı, düzenli ve DRY (Don't Repeat Yourself) ilkesine uygun şekilde yapmana yardımcı olur. Aynı sorguyu konsole veya farklı yerlerde tekrar tekrar yazarsan, scope'a dönüştür.

1class Post < ApplicationRecord
2scope:published, -> { where(published: true) }
3scope:recent, -> { order(created_at::desc) }
4scope:by_author, ->(author_id) { where(author_id: author_id) }
5end
6
7# Kullanım
8Post.published.recent
9Post.by_author(5).published

Gördüğün gibi scope'lar lambda (ok fonksiyonu) kullanır. Parametresiz scope'lar basit ok notasyonuyla yazılır; parametreli olanlar ise argüman alır. En güzel tarafı, bu scope'ları birleştirebilmen, sorgu zincirlemesi (chaining) sayesinde karmaşık filtreleri basit hale getirirsin.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Class method'la karşılaştırırsan, scope daha hızlı ve her zaman güvenli. Class method nil döndürürse, zincirlemede hata alırsın. Scope ise boş bir relation döndürerek çalışmaya devam eder. Eğer koşullu sorgu yazıyorsan, scope tercih et. Daha karmaşık iş mantığı gerekiyorsa, o zaman class method kullan.

Kısacası: scope'lar veritabanı sorgularını organize etmek, tekrarı önlemek ve kodunu okunabilir kılmak için Rails'in en pratik araçlarından biri. Modelin üstünü scope'larla doldurmak, gelecekte bakım yapmayı çok kolaylaştırır.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz