我可以通过用户是否投票来限制所有问题。在模型中:
scope :answered_by, lambda {|u| joins(:votes).where("votes.user_id = ?", u.id) }
scope :unanswered_by, lambda {|u| joins(:votes).where("votes.user_id != ?", u.id) }
在控制器中,我这样称呼他们:
@answered = Question.answered_by(current_user)
@unanswered = Question.unanswered_by(current_user)
作用域未应答的\u不正确。我基本上是想找到没有投票权的地方。相反,它试图寻找是否有不等于当前用户的投票。有没有办法返回不存在连接的所有记录?
如果您想以优雅和Rails式的方式进行EXISTS
查询,您可以使用我编写的“存在的地方”gem:
Question.where_not_exists(:votes, user_id: current_user.id)
当然,您也可以创建它的范围:
scope :unanswered_by, ->(user){ where_not_exists(:votes, user_id: user.id) }
试试这个,让我知道它是否有效
编辑-1
scope :unanswered_questions, lambda { joins('LEFT OUTER JOIN votes ON questions.id = votes.question_id').where('votes.question_id IS NULL') }
编辑-2
scope :unanswered_by, lambda {|u| where("questions.id NOT IN (SELECT votes.question_id from votes where votes.user_id = ?)",u.id) }
使用EXISTS
表达式:
WHERE NOT EXISTS (
SELECT FROM votes v -- SELECT list can be empty
WHERE v.some_id = base_table.some_id
AND v.user_id = ?
)
...在NOTEXISTS()
()和NOTIN()
()之间有两个方面:
>
性能
通常更快。一旦找到第一个匹配项,它就会停止处理子查询。手册:
子查询通常只执行足够长的时间来确定是否至少返回一行,而不是一直执行到完成。
Ⓘ 也可以由查询计划器进行优化,但优化程度较低,因为处理使其更加复杂。
正确性
如果子查询表达式中的结果值之一为NULL,则Ⓘ 为空,而公共逻辑预期为真Ⓔ 将返回TRUE。手册:
如果所有每行结果都不相等或为null,且至少有一个为null,则非IN的结果为null。
本质上,(Not)EXISTS
在大多数情况下是更好的选择。
您的查询可以如下所示:
SELECT *
FROM questions q
WHERE NOT EXISTS (
SELECT FROM votes v
WHERE v.question_id = q.id
AND v.user_id = ?
);
不要加入基本查询中的投票。这将使努力无效。
除了不存在
和
不在
之外,还有其他语法选项,其中
左连接/为空
和
除外
。请参见:
选择其他表中不存在的行
问题内容: 想象两个表(A和B): 现在,我想从A中删除B中不存在的记录,例如,从A中删除1、6和4。 我最初的想法是,您可以“否定”联接的结果。 问题答案: 我假设这些列被命名为。
问题内容: 我有以下两个表(在MySQL中): 如何找出哪些电话是由人,他们提出是不是在?所需的输出将是: 问题答案: 有几种不同的方法可以执行此操作,效率各不相同,具体取决于查询优化器的性能以及两个表的相对大小: 这是最简短的陈述,如果您的电话簿很短,则可能是最快的陈述: 或(感谢WOPR) (忽略这一点,正如其他人所说的那样,通常最好只选择所需的列,而不是’ ‘)
问题内容: 我有以下两个SQL表(在MySQL中): 如何找出哪些电话是由人,他们提出是不是在?所需的输出将是: 任何帮助将非常感激。 问题答案: 有几种不同的方法可以执行此操作,效率各不相同,具体取决于查询优化器的性能以及两个表的相对大小: 这是最简短的陈述,如果您的电话簿很短,则可能是最快的陈述: 或者(由于Alterlife) 或(感谢WOPR) (如其他人所说,忽略它通常最好只选择想要的列
问题内容: 我需要查找连接到给定计算机的所有可写存储设备, 无论 它们 是否 已安装。 最糟糕的方法是 尝试与可写设备()相对应的每个条目。 有更好的解决方案,还是我应该坚持呢? 问题答案: 将列出系统可识别的所有块设备和分区。然后,您可以尝试使用来确定分区上存在的文件系统类型(如果有)。
问题内容: 如何使用Javascript检查互联网连接?这样,我可以有一些条件说“在生产过程中使用Google缓存的JQuery版本,在开发过程中使用该版本或本地版本,具体取决于Internet连接”。 问题答案: 针对您的特定情况的最佳选择可能是: 在您的结束标记之前: 鉴于您的问题集中在jQuery上,这可能是最简单的方法。 如果您想要一个更强大的解决方案,可以尝试: 阅读有关W3C在脱机We