我正在编写一个 Rails 应用程序,用户可以在其中使用问题数据库测试自己。我有用户和问题表。当一个问题被回答时,一个 QuestionAttempt 对象被创建,链接到用户和问题,它有一个布尔属性“正确”,存储用户是否得到了正确的问题。
我想允许用户使用以下选项搜索问题:
- 显示我以前没有尝试过的问题(即此问题/用户不存在 QuestionAttempt 对象)
- 显示我以前没有回答过的问题(即此问题/用户不存在 QuestionAttempt 对象,正确 == true)
鉴于数据库很大,我需要相当有效的查询来做到这一点。我已经使用以下代码成功实现了这些查询中的第一个:
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 模型的问题。我尝试了以下方法:
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)")
这会选择尚未尝试或回答错误的问题。然而,问题可能已被多次尝试,有一些正确和一些不正确的答案——我不想返回这些问题,只要它们至少有一次正确的尝试。如何从该查询中排除这些问题?
非常感谢