Rails ActiveRecord
Ruby On Rails’in MVC (Model – View – Controller) yapısının Model ayağını oluşturan activerecord, Rails’e ‘agile development’ olgusunu kazandıran kullanışlı yapılardan biridir. Size activerecord’un bazı özelliklerini basit bir örnekle anlatmaya çalışacağım…
Örneğimiz bir makale sitesinin öğeleri arasındaki etkileşimi belirlemek olsun. Kullanıcılar makale ekleyip bu makalelere yorum yapabilsin. Nesneleri tanımlarsak;
user => Sistemi kullanan insanlardır. Makale ekleyebildikleri gibi, makalelere yorum da yapabilirler. Veritabanında kullanıcı adını, mailini, doğum tarihini tutalım. Sütunlar; username, email ve birthday olsun.
entry => user tarafından eklenen makalelerdir. Veritabanında kim tarafından eklendiğini, başlığını ve içeriğini tutalım. Sütunlar; entry_header, entry_text ve entry_author olsun. Tahmin edebileceğiniz gibi entry_author makalenin yazarı olup foreign key oluyo
comment => her entry için bir kullanıcı tarafından yorum yapılabilir. Yorumun hangi kullanıcı tarafından yapıldığını, hangi entry için yapıldığını tutalım. Sutunlar; comment_text, commented_to ve commented_by olsun. commented_to hangi makaleye eklendiğini belirten, commented_by ise kim tarafından eklendiğini gösteren foreign keydir…
Buna göre;
bir user, birden fazla entry sahibi olabilir. Bununla birlikte birden fazla entry için birden fazla yorum yapabilir.
bir entry, bir user’a ait olup, birden fazla yoruma sahip olabilir.
bir comment, bir entry’e ait olup, bir user tarafından yapılmıştır.
Bu durumda;
user has_many (çok sayıda sahip) entries (çok sayıda entry ingilizce çoğulu entries ile belirtilir) ve has_many comments,
entry belongs_to (ait olmak) user ve has_many comments,
comment ise belongs_to user and belongs_to entry
ilişkilerine sahip olacaktır. Burada işin güzel tarafı entries ya da comments ifadelerinde olduğu gibi sona getirilen çoğul eklerinin nedensiz yere kullanılmamasıdır…
Örneğin bir comment birden fazla user’a ya da entry’e ait olsaydı belongs_to users ve belongs_to entries diyecektik yani user ve entry varlıklarının çoğullarını kullanacaktık. Rails modeller arasındaki ilişkiyi buradan anlayacak kadar zekidir…
Model tanımlamalarımızı bu şekilde yaptıktan sonra bunları kullanma konusuna gelelim:
Örneğin entries için yazdığımız show view’i için bir entry’ye ait olan yorumları da listelemek için yapmamız gereken tek şey;
<% @entry.comments.each.do |comment| %>
<p>Comment: <%= comment.comment_text %> </p>
<% end %>
kodunu eklemek… Rails burada @entry’den sonra yazdığımız comments öğelerini bulmak için ‘select * from comments where entry_id = 1‘ gibi bir sql komutu çalıştırır.
Java MVC frameworklerinde türlü türlü bean’ler, getter ve setterlar tanımlarken rails sizi bunlarla hiç uğraştırmaz…
Ancak yukarıdaki kodu kullandığınızda hata alırsınız. Çünkü Comments tablomuzda yorumun hangi entry için yapıldığını tutuyoruz ve bunu entry_id gibi bir sütunda tutmuyoruz commented_to gibi tamamen kendi belirlediğimiz bir sutunda tutuyoruz. Dolayısıyla yukarıda yazdığım sql cümlesi entry_id diye bir sutun bulunamadı der, kızar. Ne yapacağız? Cevap çok basit:
:foreign_key => 'commented_to' kodunu eklemek…
İşte size model classlarımızın son hali:
user.rb
class User < ActiveRecord::Base
has_many :entries
has_many :comments
validates_presence_of :username, :first_name, :last_name, :birthday, :email, :job
validates_uniqueness_of :username
end
entry.rb
class Entry < ActiveRecord::Base
belongs_to :user, :foreign_key => 'entry_author'
has_many :comments, :foreign_key => 'commented_to'
validates_presence_of :entry_header, :entry_text, :entry_author
end
comment.rb
class Comment < ActiveRecord::Base
belongs_to :user, :foreign_key => "commented_by"
belongs_to :entry, :foreign_key => "commented_to"
validates_presence_of :comment_text, :commented_to, :commented_by
end
Benim anlatımımı beğenmediyseniz ( ki ben bile beğenmedim
), aşağıdaki videoyu izleyebilirsiniz:
About this entry
You’re currently reading “Rails ActiveRecord,” an entry on Hamit'in yeri
- Yayımlandı:
- Ekim 28, 2010 / 7:56 am
- Kategori
- Ruby On Rails
- Etiketler:
1 Yorum
Jump to comment form | comment rss [?] | trackback uri [?]