2012-03-07 9 views
1

私のアプリはhas_manyUserResponseモデルのQuestionモデルです。Rails 3:関連を熱心に読み込み、includes()で条件を適用する方法

具体的なUserが回答した最後の5つの質問は、user_idフィールドでフィルタリングされたUserResponseというオブジェクトで回答したいと考えています。

は、ここで私は、現在持っているものです。

Question.group("questions.id"). 
joins("inner join user_responses r on r.question_id = questions.id"). 
where("r.user_id = #{user_id}"). 
order("questions.id asc").limit(5) 

このクエリは、私が欲しいものを私に戻っていますが、私は、配列のうち、Questionを取得し、question.user_responsesを行う際の問題は、結果がのための応答の全てです上記のjoin/where節でフィルタリングすべきものだけではなく、その質問。

私はこれを行うにしようとしました:

Question.includes(:user_responses).group("questions.id"). 
joins("inner join user_responses r on r.question_id = questions.id"). 
where("r.user_id = #{user_id}"). 
order("questions.id asc").limit(5) 

は、各応答熱心な負荷をだろう、それを考えて...しかし、そのように機能するように表示されません。

どこが間違っていますか?

もし私が熱心に読み込まなければならないのは、配列をとり、その上のto_jsonを呼び出して、私のモバイルアプリケーション用のWebサービスからjsonを返す必要があるからです。 。

+0

ここでグループに参加しようとしていますか? – rwilliams

答えて

1

ここでは複雑すぎると思っています。どうやって?

Question 
    .includes(:user_responses) 
    .where("user_id = ?", user_id) 
    .order("questions.id asc") 
    .limit(5) 
+0

はい、あなたは正しいです。私はクエリが以前よりも複雑になり、問題をゼロから近づけるのではなく、古いコードをマッサージしようとしたと思います。迅速で正確な対応をしていただきありがとうございます。 – omgwot

+1

あなたはuser_id paramで潜在的なSQLインジェクションを持っていることに言及する必要があります。もちろん、それはスタックオーバーフローではなく、人々はこのコードをコピーして貼り付けます。 これをもっとうまくやってください:where( "r.user_id =?"、user_id)。 –

+0

SQLインジェクションの詳細については、こちらを参照してください。 - http://guides.rubyonrails.org/security.html#sql-injection –

関連する問題