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.
» Dallanmalar, AÄ?açsal Görünümler, TreeView
Dallanmaları anlamak için bir örnek verelim. Ã?rneÄ?in bir dizin sistemi, sayfaları listeliyor. Genel olarak bölümlere ayrılmıÅ? ve her bölümde kendi arasında bölümlere ayrılmıÅ?.
Ã?rneÄ?in:
Bilgisayar
- Programlama Dilleri
- Ruby
- Ruby Makaleleri
- Ruby Yazılımları
- Python
- Delphi
- C
- C++
- ..
- Bilgisayar Firmaları
- ...
SaÄ?lık
- Hastaneler
- ...
Burada “Bilgisayar” ana kategori, “Programlama Dilleri” bilgisayarın alt bölümü, “Ruby” “Programlama Dilleri”nin alt bölümü ve ruby nin de alt bölümleri var.
» �rnek Planlayalım
Kategoriler ve bu kategorilerin alt ürünleri var. Ã?rünler kısmı ile Å?u an için ilgilenmiyoruz. Kategoriler için de sadece bize gerekli alanları oluÅ?turacaÄ?ız.
Gerekli tablolarımızı ActiveRecord::Schema.define komutu ile oluÅ?turuyoruz.
(EÄ?er Rails projesi geliÅ?tirecekseniz; “db/migrate” klasörüne create_table kısımlarını koymanız yeterlidir.)
- def veritabani_olustur
- ActiveRecord::Schema.define do
- create_table 'kategoriler' do |t|
- t.column 'ana_id', :integer
- t.column 'baslik', :string
- end
- create_table 'urunler' do |t|
- t.column 'isim', :string
- t.column 'kategori_id', :integer
- end
- end
- end
Bu tabloları kullanacak sınıflarımızı yazıyoruz:
- require 'rubygems'
- require_gem 'activerecord'
- # kategoriye ait sınıf
- class Kategori < ActiveRecord::Base
- set_table_name 'kategoriler'
- has_many :urun
- acts_as_tree :foreign_key => 'ana_id'
- end
- # ürünlerin sınıfı
- class Urun < ActiveRecord::Base
- set_table_name 'urunler'
- belongs_to :kategori
- end
acts_as_tree burada devreye giriyor. ana_id olarak (varsayılan parent_id’dir, otomatik tanır) kategorinin bir üst bölümünün numarasını tutuyoruz.
yani alt_kategori.root yazarak en üst bölüme, alt_kategori.parent yazarak bir üst kategoriye ait bilgileri alabiliriz.
kategorisel olarak listelemek için Å?unları kullanabiliriz:
- # alt kategorileri listeler
- def kategori_listele(kat, altno)
- puts "-"*altno + "#{kat.id} - #{kat.baslik}\n"
- kat.children.each do |k|
- kategori_listele(k, altno+1)
- end
- end
- # tüm kategorileri bulur, listelenmesini söyler
- def kategori_listesi
- kategoriler = Kategori.find_all("ana_id = 0")
- kategoriler.each { |k| kategori_listele(k, 0) }
- end
tüm ana kategorileri seçmek için “ana_id = 0″ ibaresini kullandık ki alt kategorileri sorguya dahil etmeyelim. daha sonra tüm alt kategoriler için listelemeye geçtik.
bunun için activerecord’un bize sunduÄ?u “child” fonksiyonundan yararlandık. bu fonksiyon ile bölümlerin alt bölümlerine dair bilgileri buluyoruz ve bunu rekürsif fonksiyon olarak her bölüm için yapmasını saÄ?lıyoruz.
girinti için altno deÄ?erini döndürdük ki örnek çıktımızı alt bölümsel olarak görelim.
örnek çıktı:
1 - Bilgisayar
-3 - Programcilik
–4 - Ruby
—5 - Makaleler
–6 - Python
–7 - C
2 - Saglik
-8 - Hastaneler
» Alt bölüme ait dallanma örnek gösterimi
- def kategori_sekli(katx)
- ana_kategoriler = Kategori.find_by_baslik(katx).ancestors
- yazi = ""
- for k in ana_kategoriler.reverse
- yazi.concat " > #{k.baslik}"
- end
- yazi[0..2] = ""
- puts yazi
- end
kategori_sekli(’Makaleler’) fonksiyonuna örnek çıktı:
Bilgisayar > Programcilik > Ruby
Not: kategori_sekli örnek olarak verilmiÅ?tir. Birden çok makale olduÄ?unu düÅ?ünerek “id” ye göre yapılması daha doÄ?ru, gerçekci olur.
Kategori.find(katx) yazarak ve id’ye uygun deÄ?eri bulabiliriz. (Makaleler yerine id’sini göndermek Å?artıyla)
» KapanıÅ?
Acts_as_tree �rnek 1 dosyalarını yükleyebilirsiniz. (zip dosyasıdır)
Ã?rneÄ?i düzenleme yapmadan çalıÅ?tırabilmek için mysql sunucunuzda “urunler” veritabanı oluÅ?turmalı ya ad “ornek.rb” dosyasında 13..17 satırları arasında gerekli düzenlemeleri yapmalısınız.







[…] Re: kategori listeleme sorunu bir not; ruby on rails ile ?u ?ekilde yap?labiliyor kendisi. __________________ muarifer » ruby, ruby on rails, postgresql ve yaz?l?m geli?tirimi üzerine ki?isel a? günlü?ü […]
[…] id isim ana_id 1 bilgisayar 0 2 elektronik 0 3 donan?m 1 4 yaz?l?m 1 5 antivirüs 4 böylece antivirüs yaz?l?m’?n yaz?l?m da bilgisayar’?n alt kategorisi olacakt?r. Ruby On Rails ile nas?l yap?ld???na dair bir döküman haz?rlam??t?m. Mant?k olarak ayn? yap? di?er dillere de eklenebilir. Yazd?rmak için "rekürsif" bir fonksiyon olu?turabilirsiniz. __________________ muarifer » ruby, ruby on rails, postgresql ve yaz?l?m geli?tirimi üzerine ki?isel a? günlü?ü netS?nav Tasar?s?: Bölüm 1 - Bölüm 2 […]