Rails – Active Record – Model İlişkileri – 2

User ve Article Modelinin İlişkilendirilmesi

Daha önce User ve Profile modelini ilişkilendirdiğimiz şekilde, User ve Article modellerinide ilişkilendirebiliriz. Bu ilişkinin kurulması için “articles” tablosuna user_id foreign key’ini ekleyerek “users” tablosunu işaret etmemiz yeterlidir:

Oluşan *_add_user_id_to_articles.rb migrasyon dosyasını açalım:

user_id” alanı, integer değerdeki bir alana işaret ettiği için (users tablosunun id alanına) onun veri tipide integer olmalıdır. Migration’ı çalıştıralım:

Kurmaya çalıştığımız birden-coğa ilişkisi için Article modelimizi düzenleyelim:

Aynı şekilde User modelimize de bu ilişkiyi belirtelim:

has_one” ve “has_many” ilişkilerinde, ilişki kurulan karşı modele “belongs_to” tanımı eklemek adettendir, şiddetle önerilir.

İlişkili Modelin Oluşturulması

Rails console’u açarak biraz önce oluşturduğumuz model ilişkisinin başarılı olup olmadığını test edelim. Henüz ilişkili herhangi bir verimiz olmasa dahi (user_id değerine sahip olan article), konsol bize boş dizi döndürerek yanıt verir.

Boş bir dizi görmemize rağmen, hata almıyor oluşumuz bize ilişkinin başarıyla kurulduğunu söylüyor. “User” modelinin bir nesnesi olan “user“, artık “articles” sınıfını ve onun metodlarını miras alabiliyor.

Şimdi herhangi bir User’a bazı Article nesneleri ekleyelim:

  • Eğer uygulamanızda hiç bir article nesnesi yoksa “create” metoduyla oluşturabilirsiniz.;

Test edelim:

Hepsini listeleyelim:

“<<” operatörü ile ilk Article nesnesini user nesnemiz ile ilişkilendirdik, yani bir nevi atama yaptık. “<<” operatörünü çeşitli şekillerde kullanabiliriz:

Bu operatör, kurduğu ilişkiyi otomatik olarak kayıt etmektedir. Yani “save” modeliyle “user” nesnemizi kayıt etmemize gerek kalmadı. Foreign-key’in oluşturulup oluşturulmadığını test edelim:

Aynı şekilde Article nesnesinin ilişkili olduğu kullanıcıya bakalım:

Aşağıdaki tabloda; User ve Article arasında “has_many” ve “belongs_to” ilişkisi kurulduğunda otomatik olarak oluşan metodların bir özeti bulunmaktadır:

  • “user”ın, User modelinin bir nesnesi olduğu varsayılmıştır.
METOD TANIM ÖRNEK
user.articles İlişkili tüm articles nesnelerini bastırır. İlişkili nesne yoksa boş dizi basar. user.articles
user.articles << article Bir veya birden çok article nesnesi user’la ilişkilendirir ve foreign key’lerini kayıt eder. user.articles << article
user.articles << Article.new(attributes={}) Oluşturulan yeni Article nesnesini user’la ilişkilendirir. user.articles << Article.new(:title => “One to Many Relations”, :body => “Learning Relations”, :location => “Samsun”)
user.articles.first Kullanıcıyla ilişkili ilk article’ı döndürür. user.articles.first
user.articles.delete(articles) Bir veya birden çok article nesnesinin atamasını siler ve foreign key’lerini temizler. user.articles.delete(1)
user.articles.empty? Kullanıcıyla ilişkili article var mı yokmu kontrol eder. İlişkili article yoksa false döndürür. user.articles.empty?
user.articles.size Kullanıcıyla ilişkili article sayısını basar user.articles.size
user.article_ids Kullanıcıyla ilişkili article’ların id’lerini basar. user.article_ids
user.articles.clear Kullanıcıyla ilişkili tüm article’ların foreign key’lerini temizler. user.articles.clear
user.articles.find Kullanıcıyla ilişkili article’ları ID’sine göre arar. user.articles.find(8)
user.articles.build(attributes={}) Kullanıcıyla ilişkili yeni bir article nesnesi oluşturur ancak onu kaydetmez. user.articles.build(:title => “Relations”, :body => “Ütopyalar Güzeldir”, :published_at => “2013-12-26”, :location => “Istanbul”) 

user.save

user.articles.create(attributes={}) Kullanıcıyla ilişkili yeni bir article nesnesi oluşturur ve kayıt eder. user.articles.create(:title => “Relations”, :body => “Ütopyalar Güzeldir”, :published_at => “2013-12-26”, :location => “Istanbul”)
user.articles.count Kullanıcıyla ilişkili article sayısını döndürür. user.articles.count

has_many İlişkisine Ait Model Seçenekleri

Metodlar haricinde, model ilişkilerine müdahale etmemizi sağlayan bazı seçeneklerde mevcuttur. Aşağıdaki tabloda bu seçeneklerin bir özetini görebilirsiniz.

 Seçenek  açıklama  örnek
:class_name İlişkiye ait nesne ismi convention’dan tespit edilemediğinde class_name belirtmek için. has_many :articles, :class_name => “Post”
:conditions SQL – WHERE sorgusunda çalıştırılacak şartların belirtildiği option. has_many :articles, :conditions => “active = 1”
:foreign_key Convention’dan foreign_key tespit edilemediği durumlarda foreign_key belirtmek için has_many :articles, :foreign_key => “post_id”
:order SQL – ORDER_BY sorgusunun emsali. has_many :articles, :order => “published_at DESC”
:dependent :destroy olarak ayarlandığında ilişkili nesne silindiğinde alt verileride siler. Örneğin User silindiğinde, o User’a ait tüm article’ların silinmesi gibi. 

:nullify olarak ayarlandığında :destroy’dan farklı olarak nesneleri silmez, onların foreign keylerini boşa çıkartır.

has_many :articles, :dependent => :destroy 

has_many :articles, :dependent => :nullify

İlişki Seçeneklerinin Uygulanması

Daha eski tarihte oluşturulan article’ın en sonra, yenilerin ise en üstte çıkması için “:order” seçeneğini kullanabiliriz.

Eğer aynı günde paylaşılan birden çok article varsa ve bunları kendi içinde “title“ına göre sıralatmamız yani birden çok ORDER_BY sorgusu kullanmamız gerekiyorsa ikinci bir şart yazabiliriz:

Bağımlılıkların Tanımlanması

User silindiğinde, o user’la ilişkili tüm article’ların silinmesini :destroy ile sağlayabiliriz:

İlişkili article’ları silmek yerine, ilişkilerini temizlemek istiyorsak :nullify kullanabiliriz:

To be continued.

1 thought on “Rails – Active Record – Model İlişkileri – 2”

Leave a Reply