2013-04-03 16 views
7

Raylarım uygulamasında çeşitli modellere katılmayı içeren birkaç büyük SQL isteğim var. Tek bir istek 6 ila 10 tablo içerebilir.ARel kullanarak alt sorgulara nasıl katılır?

İsteği daha hızlı çalıştırmak için birleştirmelerdeki alt sorguları kullanmak istiyorum (böylece, bu tabloları birleştirmeden önce filtreleyebilir ve sütunları ihtiyacım olanlara indirgeyebilirim). Bunu, ARel'i kullanarak yapmaya çalışıyorum.

Sorunumun çözümünü orada bulduğumu sanıyordum: How to do joins on subqueries in AREL within Rails, , ancak undefined method '[]' for Arel::SelectManager aldığım için işler değişmiş olmalı.

Bunu nasıl başaracağına dair herhangi bir fikri olan var mı (dizeleri kullanmadan)?

+0

Denemek istediğiniz sorguyu gösterebilir misiniz? – mguymon

+0

Aşırı seviyeye basitleştirmek için: SELECT A. * INNER JOIN (SELECT B.a_id B B B B B> 4) B ON A.id = B.a_id –

+0

Bunu denemek için denediğiniz Ruby kodunu yazabilirsiniz. sorgu? – mguymon

cevap

8

Pierre, daha iyi bir çözüm aşağıdaki (this gist den ilham) olabileceğini düşündüm:

a = A.arel_table 
b = B.arel_table 

subquery = b.project(b[:a_id].as('A_id')).where{c > 4} 
subquery = subquery.as('intm_table') 
query = A.join(subquery).on(subquery[:A_id].eq(a[:id])) 

takma olarak adlandırılması için Özel bir nedeni yok "intm_table", sadece daha az kafa karıştırıcı olacağını düşündüm.

4

Tamam, bu yüzden benim asıl sorunum bir Arel :: SelectManager'a katılamamış olmanızdır ... ANCAK bir tablo takma adına katılabilirsiniz. Yani yukarıda benim yorum isteği oluşturmak için:

a = A.arel_table 
b = B.arel_table 

subquery = B.select(:a_id).where{c > 4} 
query = A.join(subquery.as('B')).on(b[:a_id].eq(a[:id]) 
query.to_sql # SELECT A.* INNER JOIN (SELECT B.a_id FROM B WHERE B.c > 4) B ON A.id = B.a_id 
İlgili konular