2013-04-03 12 views
7

私は、私のレールアプリケーションでさまざまなモデル間でのジョインを含む大規模なSQLリクエストをいくつか持っています。 1つの要求には、6〜10個のテーブルを含めることができます。ARelを使用してサブクエリに参加する方法は?

リクエストを高速に実行するには、ジョインでサブクエリを使用します(ジョインの前にこれらのテーブルをフィルタリングし、必要なカラムに減らすことができます)。私はARelを使ってこれを達成しようとしています。

How to do joins on subqueries in AREL within Rails,私はundefined method '[]' for Arel::SelectManagerを取得したので、物事が変更されている必要があります。

文字列を使用せずに誰でもこれを達成する方法を知っていますか?

+0

しようとしているクエリを表示できますか? – mguymon

+0

極端なレベルに簡略化するには: SELECT A. * INNER JOIN(SELECT B.a_id Bから> Bc> 4)B ON A.id = B.a_id –

+0

Rubyコードをクエリ? – mguymon

答えて

8

ピエール、私はよりよい解決策は、以下の(this gistからインスピレーション)ことができると思っていません:

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])) 

としてエイリアスに名前を付けるための特段の理由"intm_table"、私はちょっと混乱しないと思った。

4

私の主な問題はArel :: SelectManagerに参加できないということでしたが、テーブルエイリアシングに参加することができます。 は、したがって、上記の私のコメントでリクエストを生成する:

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 
関連する問題