“Derinlemesine ActiveRecord” Serisi Hakkında
Seride “Ruby On Rails”in kalbi niteliÄ?inde olan “ActiveRecord” modülüne, barındırdıÄ?ı sınıflara, nasıl çalıÅ?tıÄ?ına, ActiveRecord’un veritabanı tablolarını iliÅ?kilendirmesine detaylı bir bir inceleme yapılacaktır. ActiveRecord tabloları nasıl bulur, nasıl birbirleriyle iliÅ?kilendirir, bizim adımıza neler yapabilir soruları sorulacak bunlara örnekler eÅ?liÄ?inde cevap verilmeye çalıÅ?ılacaktır.
Ayrıca yazının sonunda “çok ufak” bir ActiveRecord kopyasına ulaÅ?acaksınız.
ActiveRecord Sınıfı
ActiveRecord Ruby On Railsde “model”lerimiz için kullandıÄ?ımız sınıfları barındıran “modülün” adıdır. Verilen tabloyu ve tabloya iliÅ?kilendirilmiÅ? diÄ?er tabloları nesnelere çevirerek, tabloyu bir nesne gibi kullanmamızı saÄ?lıyor. (Bu sistem Object-relational mapping olarak geçmektedir.)
ActiveRecord ve Ruby On Rails İçerisindeki Görevi
ActiveRecord Rails’in baÄ?ımlı olduÄ?u paketlerden biridir. ( Aslen Ruby On Rails ActiveRecord gibi olan bir çok modülün birleÅ?mesinden oluÅ?muÅ?tur. Bu sebeple ActiveRecord’u Rails dıÅ?ındaki herhangi bir Ruby yazılımında kullanmak yararınızadır. )
Veritabanındaki tabloları Rails’de nesnesel olarak kullanmak için oluÅ?turduÄ?umuz her “model” aslında ActiveRecord modülündeki “Base” sınıfından türetilen bir altsınıftır. ( class ModelAdi < ActiveRecord::Base ) Bu demek oluyor ki; Rails’in tüm veritabanı ile olan iÅ?lemlerinin yükünü ActiveRecord modülündeki Base sınıfı taÅ?ımaktadır. Veritabanını alıp nesne gibi kullanmamızı ActiveRecord modeline borçluyuz.
Yazının devamında ActiveRecord modeline ait detaylı açıklamaların “ilk” kısmını bulabilirsiniz.
ORM, ActiveRecord ‘ un İÅ?leme Prensipleri
Kısacası “ORM sayesinde veritabanındaki tabloları bir nesneymiÅ?çesine kullanabiliriz“.
Bu Nasıl Oluyor?
Ruby yorumlanan bir dil olduÄ?u için kaynak kodlarınızın hiç iÅ?lenmeyecek noktalarında hatalı satırlar olsa bile - diÄ?er fonksiyonları etkilemeyecek biçimde - (örneÄ?in tanımlanmamıÅ? fonksiyonlar) size bir uyarı vermeyecektir. Ta ki; “iÅ?lem görmeye baÅ?layana kadar”
- def deneme
- bu
- bir
- ornektir
- boyle_bir_fonksiyon_yok?
- end
- puts "hata vermedi?\nilginç deÄ?il mi?"
Ã?rneÄ?in yukarıda bulunan kaynak kod çalıÅ?tırıldıÄ?ında herhangi bir hata vermeyecektir. Oysa ki “bu”, “bir” ve diÄ?erleri tanımlanmamıÅ? “Å?ey”ler olmasına raÄ?men.
Bunun sebebi yukarıda belirtildiÄ?i gibi bu satırların yazılım tarafından iÅ?lenmeye baÅ?lamamıÅ? olması.
ActiveRecord ile bunun ilgisi ne?
ActiveRecord’un o çok sevdiÄ?imiz özelliklerinin çoÄ?u tamamen bu özelliÄ?e dayanarak geliÅ?tirilmiÅ?tir. Ã?rneÄ?in “uyeler” tablomuzun “Uye” isimli modeli olduÄ?unu düÅ?ünürsek Uye.isim yazarak tablodaki “isim” alanına eriÅ?im saÄ?layabiliyoruz. Aslında bizim “Uye” sınıfımızda (modeller ActiveRecord::Base’ın alt sınıfıdır, yukarıda deÄ?inmiÅ?tik) “isim” diye bir deÄ?iÅ?ken yok.
Yok, ama nasıl var?
Aslında bu teknik “metaprogramming” olarak geçiyor. Kısacası Å?udur ki, yazılımın kodlarının gene yazılım tarafından oluÅ?turulması. Yazılımın kodlarını oluÅ?turmak için kod yazmak oldukça ilginç deÄ?il mi?
Peki Bu Nasıl Oluyor?
Ruby programlama dilinin bize sunduÄ?u sayısız imkanlardan biri de bu tekniÄ?i oldukça kolay bir Å?ekilde kullanmamızdır. Bulunamayan ve bilinmeyen nesneleri yakalamak için Ruby bize “method_missing” fonksiyonunu sunmuÅ?tur.
Anladım ama… Nasıl Oluyor?
AÅ?aÄ?ıdaki örneÄ?i inceleyerek konuyu tam anlamıyla anlatabileceÄ?imi, anlayabileceÄ?imizi düÅ?ünüyorum.
- def method_missing(isim)
- puts isim.to_s
- end
- def deneme
- bu
- bir
- ornektir
- boyle_bir_fonksiyon_yok?
- end
AlacaÄ?ınız çıktı oldukça ilginç deÄ?il mi?
Varolmayan fonksiyonları yakaladık ve bunları “string”e çevirip ekrana yazdırdık.
Peki, find_by olayları?
Rails’in müthiÅ? özelliklerinden biri de sanki yazılım ile konuÅ?urmuÅ?çasına find_by_isim(”murat”) diyerek veritabanı ile iletiÅ?im kurabilmemiz. Bu olayda tamamen method_missing fonksiyonuna baÄ?lı olarak iÅ?lemektedir. Sadece “düzenli ifadeler” ile gerekli sorgulama yapılmaktadır. (olmayan fonksiyon “find_by” ile baÅ?lıyorsa sonraki karakterleri al, sorguyu buna göre Å?ekillendir)
Biterken
“Derinlemesine ActiveRecord” serimizin ilk bölümünde sistemin nasıl çalıÅ?tıÄ?ına dair özet bir inceleme yaptık. İlk bölümü “basit” bir ActiveRecord kopyası yaparak kapatmayı uygun gördüm.
# ActiveRecord'a benzemek amacıyla
# oluÅ?turulmuÅ?tur.
#
# muarifer, murat.celiker@gmail.com
module EtkinKayit
class Ana
def method_missing(method)
if method.to_s =~ /bul_/
puts "Bulunacak: #{$'}"
elsif
# listeden kaydı al
puts "Döndürülecek DeÄ?iÅ?ken: #{method.to_s}"
end
end
end
end
# UrunGecici < EtkinKayit::Ana biçiminde oluÅ?turulup
# Yeni bir UrunGecici oluÅ?turarakta kullanılabilirdi
UrunGecici = EtkinKayit::Ana.new
UrunGecici.bul_kategori
UrunGecici.urun
UrunGecici.bul_urun
KapanıÅ?
Serinin bir sonraki bölümlerinde ActiveRecord’a dair gerçekten kullanılabilir bilgilere deÄ?ineceÄ?iz inÅ?allah. “Gerçekten kullanılabilir”den kasıt ise Ruby On Rails için kullanabileceÄ?imiz ActiveRecord özellikleri ve “Base” sınıfına ait fonksiyonlar.







tesekkurler bu güzel paylasım için
teşekkürler sadettin.