sql - 有没有更有效的方法来使用 ActiveRecord 对此进行编码?

标签 sql ruby-on-rails ruby-on-rails-3 activerecord

我有三个表:

  1. 用户
  2. 问题
  3. 用户问题

    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/

相关文章:

mysql - 子查询返回多于 1 行 - MySQL

php - MySQL 一对一关系优化

ruby-on-rails - Div 出现在错误的位置

ruby-on-rails - spork 可以处理 rake 任务吗?

ruby-on-rails - Rails 模型定义

ruby-on-rails - 为什么当我尝试按照 ruby​​ on rails 入门指南添加第二个模型时,rails 在 PostsController#index 中给我一个 SyntaxError

sql - MS Access - 如果仅使用 LEFT 函数,则联接值相似的表?

sql - 如何在sql表中找到图像的大小?

ruby-on-rails - 格式化时间戳

ruby-on-rails - 仅脚手架 Rails 中的 View 文件。可能的?