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;

class Yorum < ActiveRecord::Base
 
 
def self.onay
   
find(:all, :conditions => {:onay => true})
 
end
  ..

Åžu oldu:

class Yorum < ActiveRecord::Base
 
named_scope :etkin, :conditions => { :onay => true }
end

Aşağıdaki örnek ile farklı bir kullanım alanını da görebiliriz (orjinali).

class User < ActiveRecord::Base
 
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.

class Mesaj < ActiveRecord::Base
 
 
# ...
 
# ...  
 
 
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.

def kayit_tarihi
 
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.

# Türkçe Tarihsel Alan Adlarını Otomatik Kaydettirici
# 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.

class Soru < ActiveRecord::Base
 
bir_cok :cevap
 
suna_bagli :sinav
end

DiÄŸer iliÅŸkilendirmeleri kendiniz oluÅŸturabilirsiniz.

# Türkçe Tablo İlişkilendirmeleri
# 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.

has_many :c, :through => :b

through olmadan nasıl yapıyorduk?

:through kullanmadan öncelikle “b” tablosunu seçiyor daha sonra “c” tablosuna alanlarına eriÅ?ebiliyorduk.

# model a: has_many  :b
# 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 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ıÅ?

Devamını Okumak İstiyorum

“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.

Devamını Okumak İstiyorum

“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.

  1. # Ruby için türkçe model-veritabanı iliÅ?kilendirmesi
  2. # muarifer, murat.celiker@gmail.com
  3. Inflector.inflections do |inflect|
  4.   inflect.plural /([eiöü]([^aeıioöuü]+)|[eiöü])$/i, '\1ler'
  5.   inflect.plural /([aıou]([^aeıioöuü]+)|[aıou])$/i, '\1lar'
  6.   inflect.singular /([eiöü]([^aeıioöuü]+)|[eiöü])ler/i, '\1'
  7.   inflect.singular /([aıou]([^aeıioöuü]+)|[aıou])lar/i, '\1'
  8. 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 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.

Devamını Okumak İstiyorum

Sayfada yayımlanan yazılar aksi belirtmedildiği sürece Murat Arif Çeliker'e aittir. Yorumlar, yorumu yapan kullanıcıların kendi görüşleridir.
açılış - deneyhane - tasarılar - hakkımda - iletişim -

Sitede altyapı olarak Wordpress kullanılmıştır.