Raylar :vs :birleşimler vardır
Bu bir daha "neden her şey" yerine bir soru "nasıl bilmiyorum" soru . bunu bu şekilde iş yapmak
Kullanmak için gidiyoruz biliyorum ilişkili kayıtlarını incelemeye ilişkin bir müjde ve ekstra sorguları bir sürü katıl önlemek alırsınız çünkü :include
kullanmak için:
Post.all(:include => :comments)
Baktığınızda ancak günlükleri, hayır katılın oluyor:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
yorumların hepsini tek seferde çeker çünkü kestirmeden, ama yine de katılmak tüm belgelere söylemek zorundayım ki, ne yazık ki). Birleşim almanın tek yolu :include
yerine :joins
kullanmak için:
Post.all(:joins => :comments)
Ve gösteri günlükleri:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Bir şey mi kaçırdım? Yarım düzine dernekleri ile bir uygulamam var ve tek bir ekranda tüm verileri görüntüleyebilir. -Ed birleşim 6 bireyler yerine sorgu için daha iyi olurdu gibi geliyor. Biliyorum performans açısından değil her zaman daha iyi yapmak için katılmak yerine tek bir sorgu (aslında eğer zaman geçirdim, görünüşe göre iki ayrı sorgular üstünde daha hızlı birleştirme), ama sonra tüm belgeleri okuyorum şaşırdım görmek :include
çalışmıyor olarak reklamı.
Belki Raylarperformans, idrak sorunu ve dışında bazı durumlarda katıl değil mi?
CEVAP
:include
işlevselliği Raylar ile 2.1 olarak değişti gibi görünüyor. Raylar yapmak için kullanılan tüm durumlarda katılmak, ama performansı artırmak için bazı durumlarda birden fazla sorgu kullanmak için değiştirildi. Fabio Akita This blog post değişim bazı iyi bilgi var (başlıklı bölüme bakın "Eager Loading") Optimize edilmiş.
Raylar SOL DIŞ birleşimler 3...
raylar model alan oluştur:type-hangi a...
'vardır ve genişletmek arasındaki...
Raylar: numune için yerli geçirilmesi ...
Nasıl Raylar statik içerik yapmak?...