Derinlemesine ActiveRecord serisinin ilk bölümünde genel yapı itibariyle sistemin nasıl çalıÅ?tıÄ?ına deÄ?inmiÅ?tik. Bu bölümde ise sistem ile ilgili kullanılabilir bilgilere deÄ?ineceÄ?iz. Seride Ruby On Rails’e yönelmenin dıÅ?ında Ruby uygulamalarımızda da ActiveRecord’u nasıl kullanabilirizin cevabı da aranacaktır.
Makale Yol Haritası
- ActiveRecord Nedir, Ne DeÄ?ildir?
- DoÄ?ru Ayarlamalar Nedir? Nasıl Yapılır?
- Tablo İliÅ?kilendirmeleri
- has_one ile basit Yordamlar
- has_many ile Basit Yordamlar
- belongs_to ile Basit Yordamlar
- has_one mı belongs_to mu?
- KapanıÅ?
ActiveRecord Neler Yapabilir, Neler Yapamaz?
ActiveRecord ayarlandıÄ?ı sürece bizim adımıza sql komutlarını “sınıf” üzerinden çalıÅ?tırabilir, alanlar üzerinde genel kontrolleri yapabilir, “trigger” gibiymiÅ?çesine kendisini kullandırabilir, tablolarımızın birbirleriyle iliÅ?kilendirmelerini - eÄ?er doÄ?ru ayarlanmıÅ?sa - otomatik yapabilir, iliÅ?kilendirilmiÅ? tablolara izin verebilir.
DoÄ?ru ayarlamalar ile hemen hemen tüm veritabansal iÅ?lemlerimizi ActiveRecord modülü üzerinden yapabiliriz.
DoÄ?ru Ayarlar Derken?
Ã?rneÄ?in tablo iliÅ?kilendirmelerinde iki activerecord::base sınıflı nesneyi birbirine baÄ?lar ve bunları otomatik tanıması istiyorsak, “foreign_key” olarak model_id Å?eklinde kullanmalıyız. (Kullanmıyor isek bunu belirtmeliyiz.)
Veya Rails için, modele ait tablo ismini otomatik bulmasını istiyorsak doÄ?ru ayarlamalar yapmalıyız. (Otomatik Türkçe tanıması için gerekli kodlar sayfada mevcut.)
Otomatik ayarlamaların dıÅ?ında tamamı genel kod içerisinden de ayarlanabilir.
Ruby On Rails, model isimlerini otomatik olarak tabloya baÄ?layabilir. Bu aslen “Inflector” sınıfındaki düzenli ifadeler sayesinde oluyor. ActiveRecord::Base sınıf (Model) tablo adını bulmak için bu sınıftaki gerekli ayarlara bakıyor. (Inflector.inflections)
Aynı Å?ekilde iki tabloyu birbirine baÄ?lamak için kullanılan “has_many” ya da diÄ?erlerinden sonra belirtilen “:model” Å?eklindeki deÄ?er o modelin tablo adını buluyor.
Tablo İliÅ?kilendirmeleri
Tablo iliÅ?kilendirmelerini anlamak için netSınav tasarısındaki yapıya dönebiliriz. Ã?rnek olarak “dersler” ve “sınavlar” arasındaki iliÅ?kiyi ele alabiliriz. Ã?rneÄ?in derse ait bir veya daha (ing.: has many) fazla sınav olabilir. Ayrıca her sınavın da bir dersi vardır. (belongs to)
Derse ait bir çok sınav olabilir ve her sınavın bir dersi vardır. Ayrıca her öÄ?retmen yalnız bir derse girebilir (has_one)
Ã?rneÄ?in “matematik” dersinde “sayılar”, “türev”, “logaritma” konularına dair sınavlar olabilir. “Türev” sınavı Matematik dersinin sınavıdır.
ActiveRecord modülü çok geliÅ?miÅ? bir yapıdır. Tüm iÅ?levlerini “RDoc” üzerinden görebilirsiniz. Seride zamanla daha derinlere inilecektir.
Dersler ve Sınavlar tablomuzu oluÅ?turalım.
- CREATE TABLE ogretmenler(
- id int(11) NOT NULL auto_increment,
- isim varchar NOT NULL,
- ders_id INT(11) NOT NULL,
- PRIMARY KEY (id)
- )
- CREATE TABLE dersler (
- id int(11) NOT NULL auto_increment,
- isim varchar NOT NULL,
- PRIMARY KEY (id)
- )
- CREATE TABLE sinavlar (
- id int(11) NOT NULL auto_increment,
- isim varchar NOT NULL,
- ders_id INT(11) NOT NULL,
- PRIMARY KEY(id)
- )
“Sınavlar” tablosundaki “ders_id” alanını ActiveRecord otomatik olarak “ders” modeline baÄ?layacaktır. model_id biçimindeki alanlar eÄ?er iliÅ?kilendirme yapılmıÅ? ise Rails tarafından birbirine baÄ?lanır. Fakat ders_id yerine baÅ?ka bir alan kullanılmıÅ? ise bunu Rails’e bildirmeliyiz. (foreign_key => alan)
has_one & has_many iliÅ?kilendirmesi
Her öÄ?retmenin tek bir derse girdiÄ?ini ve “Derslere ait birçok sınav” olduÄ?unu düÅ?ündüÄ?ümüzde bunu RoR’a Å?u Å?ekilde belirtebiliriz.
- class Ders < ActiveRecord::Base
- # has_one iliÅ?kilendirmesi "ogretmenler" tablosundan birine referans edecek
- has_one :ogretmen
- # has_many iliÅ?kilendirmesi dersin birden fazla sınav tablosundan
- # veri içerebileceÄ?ini belirtir
- has_many :sinav
- # eÄ?er sınav tablosunda derslere iÅ?aret eden alan
- # ders_id deÄ?il ise (model_id biçemlid deÄ?il ise)
- # bunu belirtmeliyiz
- # has_many :sinav, :foreign_key => 'alan'
- end
- # Birinci derse ait tüm sınavları kolayca çekebiliriz
- ilk_ders_sinavlar = Ders.find(:first).sinav
- #
- # has_many ile gelen özel komutlar
- #
- # derse ait sınav listesinin boÅ? olup/olmadıÄ?ını göndürür
- ilk_ders_sinavlar.empty?
- ilk_ders_sinavlar.create(:isim => 'türev', :ders_id => 1) if ilk_ders_sinavlar.empty?
- # < < ile listeye yeni bir sınav ekleyebiliriz
- yeni_sinav = Sinav.new
- yeni_sinav.isim = "Sayılar"
- Ders.find(:first).sinav << yeni_sinav
- # size ile adetini öÄ?renebiliriz
- ilk_ders_sinavlar.size
belongs_to iliÅ?kilendirmesi
Sınavlar bir derse ait olmak zorundadır, derse baÄ?lıdır.
- class Sinav < ActiveRecord::Base
-
- # belongs_to sınavın derse baÄ?lı olduÄ?unu bildirir
- # sınav üzerinden derse ulaÅ?mayı çok kolay hale getirir
- belongs_to :ders
-
- # eÄ?er iÅ?aret edilen farklı isme sahip ise
- # :foreign_key ayarı ile bunu belirtmeliyiz
- belongs_to :ders, :foreign_key => 'alan'
-
- end
-
- # Ã?rneÄ?in tablomuzda ilk dersin "Türev" olduÄ?unu varsayarsak
- puts Sinav.find(:first).ders.isim
- # çıktı "Matematik" olacaktır.
-
-
- # nil? fonksiyonu ile var olup olmadıÄ?ını öÄ?renebiliriz
- puts "Yazılım Hatası: Ders BelirtilmemiÅ?" if Sinav.find(:first).ders.nil?
has_one ya da belongs_to?
- class Sinav < ActiveRecord::Base
- # belongs_to sınavın derse baÄ?lı olduÄ?unu bildirir
- # sınav üzerinden derse ulaÅ?mayı çok kolay hale getirir
- belongs_to :ders
- # eÄ?er iÅ?aret edilen farklı isme sahip ise
- # :foreign_key ayarı ile bunu belirtmeliyiz
- belongs_to :ders, :foreign_key => 'alan'
- end
- # Ã?rneÄ?in tablomuzda ilk dersin "Türev" olduÄ?unu varsayarsak
- puts Sinav.find(:first).ders.isim
- # çıktı "Matematik" olacaktır.
- # nil? fonksiyonu ile var olup olmadıÄ?ını öÄ?renebiliriz
- puts "Yazılım Hatası: Ders BelirtilmemiÅ?" if Sinav.find(:first).ders.nil?
İliÅ?kilendirmelerde has_one ya da belongs_to kullanırken tablolar arasındaki iliÅ?kilere göre bunları belirtmeliyiz. “Foreign Key” olan tablo “belongs_to” buna karÅ?ın baÅ?ka bir alanda kendisine iÅ?aret edilen tablo “has_one” (has_many içinde geçerli) olarak tanımlanır. Buradaki “foreign key” ibaresi alanın baÅ?ka bir tablodaki alana iÅ?aret etmesini belirtir. (örneÄ?in sınavlar tablosundaki “ders_id” alanı)
KapanıÅ?
ActiveRecord sınıfı tüm veritabansal yükü üzerinizden alabilir. Serinin ilerleyen bölümlerde diÄ?er iliÅ?kilendirmelerin yanı sıra farklı tablolar üzerinden birbirine baÄ?lanmayı ve daha da derinlere inerek activerecord’ın bir tetikleyici (trigger) gibi çalıÅ?masını göreceÄ?iz inÅ?allah.






