Edge Rails’e has_finder eklentisi dahil edilmiÅŸ ve ismen named_scope adını almış.
Biri yukarıdaki cümleyi kursa hiç heyecan duymazdım, çünkü bilmezdim ki has_finder eklentisinin ne kadar güzel olduğunu.
Misalen;
Åžu iken;
def self.onay
find(:all, :conditions => {:onay => true})
end
..
Åžu oldu:
named_scope :etkin, :conditions => { :onay => true }
end
Aşağıdaki örnek ile farklı bir kullanım alanını da görebiliriz (orjinali).
named_scope :inactive, :conditions => {:active => false} do
def activate
each { |i| i.update_attribute(:active, true) }
end
end
end
# Re-activate all inactive users
User.inactive.activate
Gibi.
named_scope yazılım geliştiricisinin işini kolaylaştıran, ruby dili esnekliğinden yararlanan güzel bir çalışma olmuş. Faydalı.
Tablomuzda kayıt ekleme yahut güncelleme anında mutlaka doldurulması gereken alanlar olabilir.
GiriÅŸ
Rails tümleşik bir geliştirme ortamıdır. Yazılımın bölümleri arasında ki düzeni siz belirttiğiniz sürece otomatik olarak sağlayabilir.
ActiveRecord modülü gerekli alanların kontrolünü yapmak için bizlere oldukça geniş imkanlar sunar.
Avi formatında, yüksek çözünürlüklü ekran görüntüsüne ulaşabilirsiniz.
validate fonksiyonu
ActiveRecord sınıfı ve buna ait alt sınıflar “validate” fonksiyonuna sahiptir. Bu fonksiyonu yeniden yazarak kendimize göre özelleÅŸtirebiliriz.
validate fonksiyonu her kayıt öncesinde çalışır.
# ...
# ...
protected
def validate
errors.add(:isim, "Aynı isimle daha önce mesaj yazılmış") if isim_kontrol(isim)
errors.add(:soyisim, "Boş bırakılamaz") if soyisim.empty?
end
end
Bazı kontrollerin sadece yeni bir kayıt anında yapılmasını ya da bazılarının sadece güncelleme anında yapılmasını isteyebiliriz.
validate_on_create & validate_on_update
Yalnızca yeni kayıt anında kontrol yapılmasını istiyorsak “validate_on_create” fonksiyonunu yeniden yazabiliriz. Aynı biçimde, yalnızca güncelleme anlarında kontrol için de “validate_on_update” fonksiyonunu yeniden yazabiliriz.
Hazır Denetleme Fonksiyonları
Rails, genel denetlemeler için bize hazır fonksiyonlar sunmuştur.
- Alanın mutlak doluluğunu kontrol etmek için: validates_presence_of
Örnek kullanım: validates_presence_of :isim - İçeriğin belirli formata uyma zorunluşuğı: validates_format_of
Örnek kullanım: validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i - İçeriğin uzunluğunun kontrolü: validates_length_of
Örnek kullanım: validates_length_of :isim, :maximum=>30 - İçeriğin sayısallığının kontrolü: validates_numericality_of
Örnek kullanım: validates_numericality_of :oy, :only_integer => true - İçeriğin kayda özel olmasının kontrolü: validates_uniqueness_of
Örnek kullanım: validates_uniqueness_of :isim, :on => :create
Sunum
Makaleye ait sunumu izleyerek örneklerin çalışmasını ve detaylı kullanımını görebilirsiniz.
Avi formatında, yüksek çözünürlüklü ekran görüntüsüne ulaşabilirsiniz.
Daha önce “Türkçe Alan Adları İçin Tarihsel Kayıtlar ( created_at & updated_at => kayit_tarihi , guncelleme_tarihi )” konusunda bahsettiÄŸim Rails’in otomatik olarak tarih atadığı “created_at|updated_at” ve “updated_at|updated_on” alanlarını Türkçe isim kullanarak deÄŸiÅŸtirmek için daha baÅŸka bi’ yol ise ÅŸu ÅŸekilde;
Not
Bu yolda Tablodaki alanların isimlerinin created_at|created_on, updated_at|updated_on şeklinde olması gerektiğini unutmayınız. Yapılan iş sadece başka isimden bu alanlara erişmek olacaktır.
Amaç
Yazının asıl amacı tablo alanlarını belirli bir standardın dışına nasıl çıkarabilirize cevap vermektir. Railsin otomatik oluÅŸturduÄŸu “attribute” olaylarını el ile yapmayı görmektir.
self[:created_at]
end
def kayit_tarihi(tarih)
self[:created_at] = tarih
end
# read_attribute ile self[:...] aynı işlevi yapar
def guncellenme_tarihi
read_attribute(:updated_at)
end
# self[..] = blabla yazmak için write_attribute kullanılır
def guncellenme_tarihi(tarih)
write_attribute(:updated_at, tarih)
end
Tüm bu alanlara sahip tablolarda bu kodu kullanmanız gerektiğini unutmayınız.
Rails ActiveRecord modülünde kaydın eklenme tarihini ve güncellenme tarihini eğer created_at|created_on ve/veya updated_at|updated_on alanlarınız var ise otomatik olarak bunlara kaydeder.
Ufak Bi’ Not:
Alanlara kaydın otomatik yapılmaması için iki yolumuz mevcut;
- ActiveRecord::Base.record_timestamps = false ile (environment.rb dosyasına ekleyerek) tüm modellerde geçerli olur.
- self.record_timestamps = false ile yazılan model için geçerli olur.
Türkçe Alan Adları
Gelelim asıl konumuza.
Artık alanlarımızı “kayit_tarihi” “guncelleme_tarihi” ÅŸeklinde oluÅŸturarak da Rails’in bu alanlara otomatik olarak kayıt yapmasını saÄŸlayabiliriz.
Bunun için environment.rb dosyasına aşağıdaki satırları eklemeniz gerekmektedir.
# muarifer, http://www.ikinoktayazilim.com/wordpress
module Muarifer
module EtkinKayit
module Zaman
# önceki fonk.ları değiştirelim
def self.included(base)
base.alias_method_chain :create, :tr
base.alias_method_chain :update, :tr
end
# oluÅŸturma tarihini otomatik kaydet
def create_with_tr
if record_timestamps
t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
write_attribute('kayit_tarihi', t) if respond_to?(*:kayit_tarihi) && kayit_tarihi.nil?
write_attribute('guncelleme_tarihi', t) if respond_to?(:guncelleme_tarihi)
end
create_with_timestamps
end
# güncelleme tarihini otomatik kaydet
def update_with_tr
if record_timestamps
t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
write_attribute('guncelleme_tarihi', t) if respond_to?(:guncelleme_tarihi)
end
update_with_timestamps
end
end
end
end
ActiveRecord::Base.class_eval {
include Muarifer::EtkinKayit::Zaman
}
Bir Not Daha
Kodlarımızı projeye dahil ettikten sonra created_at|created_on ve updated_at|updated_on alanları da güncellenmeye devam edecektir. Bu konuda sıkıntınız olmasın.
Ruby dilinin nimetlerinden yararlanarak Rails’in tablo iliÅŸkilendirmelerini belirtmek için Türkçe makrolar oluÅŸturdum. has_many için bir_cok ve belongs_to için suna_bagli.
Yani artık şöyle bir ilişkilendirme yapabiliriz.
bir_cok :cevap
suna_bagli :sinav
end
DiÄŸer iliÅŸkilendirmeleri kendiniz oluÅŸturabilirsiniz.
# muarifer , ikinoktayazilim.com/wordpress
module ActiveRecord::Associations::ClassMethods
alias :bir_cok :has_many
alias :suna_bagli :belongs_to
end
Nasıl Çalışıyor?
Anahtar Kelime: ruby alias
Seminer verirken hep yaptığımın dışında - farkında olmadan - önce Rails projesi oluÅŸturup daha sonra MySQL sunucusunu çalıştırdığımda rails’in MySQL için “.sock dosyası bulunamadı” tarzındaki hata mesajını aldım. Database.yml dosyasını açıp “Pardus” için socket dosyasını yazma giriÅŸimim ise dosyanın tam yerini bulamamamdan-bilemememden ötürü hüsranla sonuçlandı. Çareyi projeyi silip yeniden oluÅŸturmakta buldum.
Kısacası eÄŸer projeye baÅŸlamadan önce MySQL Sunucunuz açık ise Rails otomatik olarak mysql.sock dosyasının yerini buluyor ve bunu “database.yml” dosyasına yazıyor. EÄŸer sunucunuz kapalı ise ve mysql.sock dosyanız /var/temp/mysql.sock dosyasından farklı yerde ise “mysql.sock” dosyası bulunamadığı için veritabansal iÅŸlemlerinizde rails hata döndürüyor.
Ayrıca Pardus için mysql.sock dosyasının yerini de not almakta fayda var;
socket: /var/run/mysqld/mysqld.sock
Kullandığınız iÅŸletim sisteminin “mysql.sock” dosyasını nerede sakladığını bilmiyor iseniz MySQL ayar dosyanıza (my.cnf) bakabilirsiniz:
less /etc/mysql/my.cnf
- Öneri için Fatih Ergüven‘e teÅŸekkürler.
Bazen öyle zaman olur ki bir deÄ?ere eriÅ?mek için diÄ?er bir tablonun o alandaki kaydını kullanırız (join).
“Join”i Å?öyle anlatayım, bize gerekli olan alanın deÄ?erini tuttuÄ?umuzu (foreign key) düÅ?ünelim, fakat bizim o deÄ?erinde (tablonun) alanlarına eriÅ?memiz lazım geldiÄ?ini varsayalım.
Bir örnek vermek gerekirse;
a tablosunda b tablosunda bulunan “id” deÄ?erini tuttuÄ?umuzu düÅ?ünelim. Aynı zamanda “b” tablosunda da “c” tablosunda bulunan kayıtların “id” deÄ?erinin tutulduÄ?unu düÅ?ünelim.
a.b_id
b.c_id
İÅ?te bu noktada, a tablosundan “c” tablosunda bulunan alanlara direkt eriÅ?im saÄ?lamak için “through” kullanıyoruz.
Yukarıdaki örnekte verilen a tablosundan “c” tablosunun alanlarına “direkt” eriÅ?im saÄ?lamak için aÅ?aÄ?ıdaki kodları kullanabiliriz.
through olmadan nasıl yapıyorduk?
:through kullanmadan öncelikle “b” tablosunu seçiyor daha sonra “c” tablosuna alanlarına eriÅ?ebiliyorduk.
# model b: belongs_to :c
# c tablosundaki isim alanına eriÅ?mek için
a.b.c.alan
# ----------
# model a: has_many :c, :through :b
# c tablosundaki isim alanına eriÅ?mek için
a.c.alan
Derinlemesine ActiveRecord (2) 24/01/07
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ıÅ?
Derinlemesine ActiveRecord (1) 16/01/07
“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.
“Ruby On Rails” oluÅ?turulan model isimlerinde otomatik olarak ingilizce kurallarına göre iliÅ?kilendirme yapar. Ã?rneÄ?in; “sample” isimli model için “samples” tablosunu arar. Tabii ki bu Türkçe uygulamalarda bize sorun çıkartacaktır. Ya her model için “set_table ‘tablo’” kullanacaksınız ya da environment.rb dosyasında sanki bunu düzensiz bir ingilizce kelimeymiÅ?çesine belirteceksiniz ( inflect.irregular ‘ders’, ‘dersler’ ) ya da son olarak Ruby On Rails’e Türkçe öÄ?reteceksiniz.
- # Ruby için türkçe model-veritabanı iliÅ?kilendirmesi
- # muarifer, murat.celiker@gmail.com
- Inflector.inflections do |inflect|
- inflect.plural /([eiöü]([^aeıioöuü]+)|[eiöü])$/i, '\1ler'
- inflect.plural /([aıou]([^aeıioöuü]+)|[aıou])$/i, '\1lar'
- inflect.singular /([eiöü]([^aeıioöuü]+)|[eiöü])ler/i, '\1'
- inflect.singular /([aıou]([^aeıioöuü]+)|[aıou])lar/i, '\1'
- end
Ruby On Rails. “ders” isim model oluÅ?turduÄ?umuzda bunu “dersler” tablosuna baÄ?layacaktır.
İÅ?leyiÅ?:
Düzenli ifade kullanarak son karakter aıou ise veya son ünsüz harflerden önceki harf (son hecenin ilk harfi) aıou ise ‘lar’, son karakter eiöü ise veya son ünsüz harflerden önceki harf eiöü ise ‘ler’ çoÄ?ul ekini koymasını söyledik.
ActiveRecord: acts_as_tree 06/01/07
ActiveRecord bizim için genel olarak tüm veritabansal iÅ?lemleri nesnelliÄ?e dönüÅ?türerek gerçekleÅ?tiriyor. öyle ki veritabanı ile konuÅ?urmuÅ?casına birden fazla Å?u var (has_many..), Å?una baÄ?lı diyebiliyoruz (belongs_to). Bunun dıÅ?ında tabloyu dallandırmayı, liste haline getirme özelliklerini (ve eklentiler sayesinde daha fazlasını) bizlere sunuyor.
Yukarıda bahsettiÄ?imiz ActiveRecord özelliklerinden “acts_as_tree” den nasıl yararlanabileceÄ?imizi, iÅ?lerimizi nasıl kolaylaÅ?tırdıÄ?ını, “nerelerde kullanabiliriz”e dair soruları yazımızda bulacaÄ?ız.






