İlişkilendirmeler
has_many ve belongs_to
İlişkilendirmeler, CoddyKit'te ücretsiz bir Ruby Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Ruby Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Ruby Academy kursu toplamda 4 dersten oluşur.
İlişkiler Nedir?
İlişkiler, Active Record'un ilgili satırlar arasında sizin için gezinebilmesini sağlayan model ilişkilerini tanımlar. Birleştirme SQL'i yazmak yerine user.posts gibi yöntemleri çağırırsınız.
- Veritabanınızdaki yabancı anahtarları yansıtırlar.
- Yardımcı yöntemleri otomatik olarak oluştururlar.
- Kodun alanı, yani uygulamanın iş konusunu yansıtır biçimde okunmasını sağlarlar.
belongs_to İlişkisi
belongs_to, bu modelin başka bir modele işaret eden bir yabancı anahtar taşıdığını belirtir. Bir Post'a ait olan Comment modelinde post_id sütunu bulunur.
class Comment < ApplicationRecord
belongs_to :post
end
# comment.post returns the parent Post
# Requires a post_id column on commentshas_many İlişkisi
has_many ilişkinin diğer tarafıdır: Bir kayıt, başka bir türden birçok kayda sahip olur. Bir Post birçok Comment kaydına sahiptir. Yabancı anahtar, çok olan tarafta bulunur.
class Post < ApplicationRecord
has_many :comments
end
# post.comments returns all related comments
# post.comments.create(body: "Nice!")Yabancı Anahtarın Bulunduğu Yer
belongs_to kullanan model yabancı anahtarı taşır. Post ve Comment için comments tablosunda post_id bulunur. Bunu bir geçişte t.references :post veya add_reference ile kurun.
create_table :comments do |t|
t.references :post, foreign_key: true
t.text :body
t.timestamps
endOluşturulan Yöntemler
has_many :comments size kullanışlı yöntemlere sahip bir koleksiyon verir:
- Okumak için
post.comments. - Bağlantılı bir kayıt eklemek için
post.comments.create(...). - Saymak için
post.comments.count. - Kimlikler için
post.comment_ids.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.counthas_one İlişkisi
has_one, bir User modelinin bir Profile modeline sahip olması gibi bire bir bağlantıları modeller. Yabancı anahtar yine diğer modelde bulunur (profiles.user_id).
class User < ApplicationRecord
has_one :profile
end
class Profile < ApplicationRecord
belongs_to :user
endthrough ile Çoktan Çoğa İlişki
Çoktan çoğa ilişkiler için bir birleştirme modeli ve has_many through kullanın. Bir Student, Enrollment satırları üzerinden birçok Course kaydına sahip olur.
class Student < ApplicationRecord
has_many :enrollments
has_many :courses, through: :enrollments
end
class Enrollment < ApplicationRecord
belongs_to :student
belongs_to :course
endBağımlı Seçenekleri
Bir üst kayıt silindiğinde alt kayıtlara ne olacağını dependent ile belirleyin:
dependent: :destroyalt kayıtları da siler.dependent: :nullifyalt kayıtların yabancı anahtarını temizler.dependent: :restrict_with_errorsilme işlemini engeller.
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
endN+1 Sorgu Sorunu
Kayıtlar arasında dolaşıp bir ilişkiye erişmek, kayıt başına bir sorgu çalıştırabilir; bu, korkulan N+1 durumudur. 10 gönderiyi ve ardından bunların yorumlarını yüklemek, 2 yerine 11 sorgu çalıştırabilir.
Veriler büyüdükçe bu durum uygulamaları fark edilmeden yavaşlatır.
# N+1: one query per post for comments
Post.all.each do |post|
puts post.comments.count
endN+1 Sorununu includes ile Çözme
includes, Active Record'a ilişkiyi birçok sorgu yerine birkaç sorguyla önceden yüklemesini söyler. Bu, N+1 sorunu için standart çözümdür.
Post.includes(:comments).each do |post|
puts post.comments.count
endclass_name ile Özel Adlar
İlişkinin adı modelle eşleşmediğinde class_name ve foreign_key gibi seçenekleri kullanın. Örneğin User modeli tarafından desteklenen bir author ilişkisi tanımlayabilirsiniz.
class Post < ApplicationRecord
belongs_to :author, class_name: "User"
endHızlı Kontrol
İlişkiler konusundaki anlayışınızı sınayın.
Özet: İlişkiler
Modelleri ilişkilendirmeyi öğrendiniz:
belongs_toyabancı anahtarı taşır;has_manyvehas_onediğer tarafı tanımlar.has_many throughçoktan çoğa ilişkileri modeller.dependentzincirleme silmeleri yönetir.includesile N+1 sorgularından kaçının.
Sırada doğrulamalarla veri bütünlüğünü sağlayacak ve sorgulamayı öğreneceğiz.
Sıkça Sorulan Sorular
“İlişkilendirmeler” dersi ücretsiz mi?
Evet — “İlişkilendirmeler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Ruby Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Ruby Academy kursu toplamda 4 dersten oluşur.
“İlişkilendirmeler” dersinde ne öğreneceğim?
has_many ve belongs_to Ruby Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Ruby Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Ruby Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“İlişkilendirmeler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Ruby Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Ruby Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Active Record Temelleri
- Geçişler
- İlişkilendirmeler
- Doğrulamalar ve Sorgular