2017-05-31 19 views
1

RailsのActiveRecordクエリインターフェイスを使用して内部結合サブクエリを持つクエリを複製するのに苦労しています。どのように私は次のことを複製します:Rails ActiveRecordサブクエリInner Join

SELECT ass.name, COUNT(DISTINCT a.question_id) AS 
    answered_questions, tq.total_questions 
    FROM assessments AS ass 
    INNER JOIN (SELECT ass.id, COUNT(q.id) AS total_questions FROM       
    questions AS q INNER JOIN assessments AS ass ON ass.id=q.assessment_id 
    GROUP BY 
    ass.id) as tq ON tq.id=ass.id 
    INNER JOIN questions AS q ON q.assessment_id=ass.id 
    INNER JOIN answers AS a ON a.assessment_id=ass.id AND a.question_id=q.id 
    INNER JOIN org_assesments AS oa ON ass.id=oa.assessment_id 
    INNER JOIN users AS u ON oa.org_id=u.org_id AND  
    a.user_id=u.id 
    WHERE u.id=1 
    GROUP BY ass.name, tq.total_questions 
    ORDER BY ass.created_at DESC 
    LIMIT 10 

私は、これは、クエリビルダを使用したサブクエリで動作するように取得することができていないようです。動作し、私の質問の評価タイトルと番号を与え、私はこれを持っているサブクエリが、答えがなけれ:

Question.joins(:assessment => {:org_assessments => {:org => :users}}).joins(:answers) 
       .where(answers:{:user_id => params[:id]}) 
       .distinct('answers.question_id').group(['assessments.name']).count() 

がどのように私は、これは上記のオリジナルのSQLのようにサブクエリを含めるように書くことができますか?

+0

は 'Assessment.joinsで始めるべきではないという。 ...? –

+0

これは 'Assessment.find_by_sql(" Above query ")'ですか? –

+0

私は、あなたの質問ではなく、評価の質問をするべきだと思います: - > Assessment.joins(:question、:answer、org_assesments::user).where(ユーザー:{id:1})。distinct( ' ( 'evaluatements.name'))order( 'assessments.created_at DESC')。count()は、 –

答えて

4

あなたはjoinsメソッドに文字列としてサブクエリを送信することがあります。

subquery = 
    TotalQuestion. 
    join(:assessments). 
    group('assessments.id'). 
    select('assessments.id, COUNT(q.id) as total_questions').to_sql 

Question.joins("(#{sub_query}) as tq on tq.id=ass.id") 

そして、あなたは、クエリの他の部分とそれを組み合わせることができます。

Question. 
    joins(:assessment => {:org_assessments => {:org => :users}}).joins(:answers). 
    joins("(#{sub_query}) as tq on tq.id=ass.id"). 
    where(answers:{:user_id => params[:id]}). 
    distinct('answers.question_id').group(['assessments.name']).count()