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 < ApplicationRecord2scope:published, -> { where(published: true) }3scope:recent, -> { order(created_at::desc) }4scope:by_author, ->(author_id) { where(author_id: author_id) }5end67# Kullanım8Post.published.recent9Post.by_author(5).publishedGö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.
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.
0 yorum