我有三个表:
- 用户
- 问题
用户问题
1.用户问题有 user_id、question_id 和 answer 列
我想随机找到一个尚未回答的问题,因此在 user_questions 表中没有一行。
如果每个问题都已回答,则返回任何随机问题。
有人告诉我这可以通过 OUTER JOIN 来完成,但我是一个 SQL 菜鸟,我不确定如何在 Rails 中做到这一点。
这是我的:
def next_question
q = Question.all - Question.joins(:user_questions).where
(user_questions: { user_id: user_id })
q = Question.all if q.empty?
return q[rand(q.size)]
end
最佳答案
在模型类上调用 all
方法几乎没有充分的理由。这会将数据库中该类型的每条记录加载到内存中,除非您绝对确定这是一小部分记录,否则您可能会挂起整个系统。即便如此,加载所有内容然后挑选一个东西并丢弃其余的东西也是非常糟糕的形式。这就像从亚马逊订购每件商品中的一件,挑选出您想要的笔,然后将剩余的商品扔进垃圾桶。
您可能想要的是随机选择一个 尚未分配的记录。这可能看起来像这样:
Question.where('id NOT IN (SELECT question_id FROM user_questions WHERE user_id=?)', user_id).order('RAND()').first
JOIN
的问题是您将在 user_questions
表中找到匹配的记录,而不是相反的记录。
此查询假定用户回答的问题数量相对较少,或者 NOT IN
可能会变得非常昂贵。
关于sql - 有没有更有效的方法来使用 ActiveRecord 对此进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9595924/