2012-11-15 25 views
9

Sitemde sorgularımı optimize etmeye çalışıyorum.activerecord'da derin iç içe geçmiş bağlantılar

Ben bir arama yapmak olsaydı girenler tablo sadece, Şimdi

bir person_id photo_id etti görünüşe aracılığıyla 3 modelini, Fotoğraf, Kişi, Puan Durumu

Foto has_many görünüşe ve birçok kişi var bir 'kişi' ben böyle bir şey yapacağını, istekli yüke, görünümlerini ve fotoğrafları istedi: Artık

Person.joins(:appearances => :photo).limit(5) 

, emin değilim bu ideali ise, ancak hipotetik sırdaşım ait görünüşleri vardırsırayla görünüşleri ve diğer insanlara sahip bir fotoğraf. Bunu vanilya SQL'de yapıp yapmadığınızı bile bilmiyorum, ancak bunun mümkün olup olmadığını merak ediyorum.

Person.joins(:appearances => :photo => :appearaces => :person).limit(5) 

hataları sonuçları, yine, sadece merak, ben görünüşleri ve benim görünümler içinde bir fotoğrafın insanları alma taşıma, ben sadece yükleme süreleri ile deney ve bu olmadığını görmek istedim Bu söz dizimi hatta mümkün.

cevap

11

'İstekli yükleme' için .include; .join, INNER JOIN işlevselliğini gerçekleştirmek içindir. Muhtemelen durumunuz için ikisini de kullanacaksınız (fotoğrafı almak için birleştirme ve ek kişileri almak için gerekli olan şeyler). Bu noktayı yapıyorum çünkü .join tek başına istekli yüklemeyi gerçekleştirmeyecek (ve ilgili varlıklara erişildikten sonra sorguları daha sonra yapacak). Eğer hevesli yük iç içe dernekler isterseniz

, çalışmak bu satırlar boyunca http://guides.rubyonrails.org/active_record_querying.html#eager-loading-multiple-associations

misiniz şeye rehberlik Ruby on özetlenen sözdizimi kullanabilir?

Photo.joins(:appearances => :person).includes(:appearances => :person).limit(5) 

Ya da kişiyle başlamak gerekiyor mu? Ayrıca

Person.joins(:appearances => :photo).includes(:appearances => :photo => :appearaces => :person).limit(5) 

, nihai (küçük) not olarak: Sahip ": görünüş" kod son satırında yanlış yazıldığından (Bu devletler ": appearaces") bazı sorunlara neden olabilir.

DÜZENLEME: Bazı küçük bir testten sonra , çalışmıyor

a => b => c => b => a 

formda dahil ilişkilendirmeleri iç içe olduğu görülmektedir. Bununla birlikte, aşağıdaki form aşağıdakileri yapar: Tabii ki, elbette, bu oldukça hoş değil.

Anlamı, aşağıdaki kodu kullanarak: aşağıdaki SQL oluşturuldu

Person.includes(:appearances => [:photo => [:appearances => :person]]).find(38)  

:

Person Load (0.3ms) SELECT `persons`.* FROM `persons` WHERE `persons`.`id` = 38 LIMIT 1 
Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE (`appearances`.person_id = 38) 
Photo Load (0.3ms) SELECT `photos`.* FROM `photos` WHERE (`photos`.`id` = 1904) 
Appearance Load (0.3ms) SELECT `appearances`.* FROM `appearances` WHERE (`appearances`.photo_id = 1904) 
Person Load (0.3ms) SELECT `persons`.* FROM `persons` WHERE (`persons`.`id` IN (38,346)) 

id # 38

+0

cehennem ile Kişiyi, tüm Fotoğraflar'dan ek Kişiler yüklenirken istekli evet, sen bir ninja'sın! Yazım hatası hakkında – jdkealy

+0

iyi çağrı ... hafızadan yazarak ve görünüşte heceleyemiyorum. – jdkealy

İlgili konular