ユーザーが質問のデータベースを使用して自分自身をテストできる Rails アプリを作成しています。ユーザーと質問のテーブルがあります。質問に回答すると、User と Question にリンクされた QuestionAttempt オブジェクトが作成されます。このオブジェクトには、ブール属性「correct」があり、ユーザーが質問に正解したかどうかが格納されます。
ユーザーが次のオプションを使用して質問を検索できるようにします。
- 以前に試みたことのない質問を表示します (つまり、この質問/ユーザーには QuestionAttempt オブジェクトが存在しません)
- 直前に取得したことのない質問を表示します (つまり、この質問/ユーザーに対して正しい == true の QuestionAttempt オブジェクトが存在しません)
データベースが大きいことを考えると、これを行うにはかなり効率的なクエリが必要です。次のコードを使用して、これらのクエリの最初のものを正常に達成しました。
Question.joins("LEFT OUTER JOIN question_attempts ON question_attempts.question_id = questions.id").where("question_attempts.id IS NULL AND question_attempts.user_id = #{user_id}")
これは、指定されたユーザーの QuestionAttempt モデルを持たないすべての質問を返します。ただし、正しい == true の QuestionAttempt モデルのないすべての質問を見つけて、2 番目の問題に必要なクエリを見つけることができません。私は次のことを試しました:
Question.joins("LEFT OUTER JOIN question_attempts ON question_attempts.question_id = questions.id").where("question_attempts.user_id = #{user_id} AND (question_attempts.correct = 0 OR question_attempts.id IS NULL)")
これにより、未試行または不正解の質問が選択されます。ただし、質問は複数回試行されている可能性があり、一部の正解と一部の不正解があります。少なくとも 1 回の正解がある限り、これらの質問を返したくありません。これらの質問をこのクエリから除外するにはどうすればよいですか?
どうもありがとう