【问题标题】:Why doesn't this ActiveRecord SQL != query do the opposite of the equivalent = query?为什么这个 ActiveRecord SQL != 查询不与等价的 = 查询相反?
【发布时间】:2015-07-14 16:23:43
【问题描述】:

我有以下 AR/SQL 代码返回以下值:

Post.joins(:comments).uniq.count # => 20

当我将它细化如下时,我得到了我期望的减少值:

Post.joins(:comments).uniq.where('comments.user_id = ?', user.id).count # => 9

因此,当我运行相同的代码但匹配被否定时,我希望得到相反的一堆记录 - 即计数 11。但我得到的是:

Post.joins(:comments).uniq.where('comments.user_id != ?', user.id).count # => 20

我想说,基本上是“查找所有带有 cmets 的帖子,其中评论是由 . 以外的人发表的。”

我是否误解了否定在 SQL 中的行为方式?

我应该指定我使用的是 Rails 3.2.18,它似乎不允许我在 Rails 指南中找到的 where.not() 语法(它会引发 ArgumentError: wrong number of arguments (0 for 1))。

【问题讨论】:

  • 嗯,我在 SQL 中一直使用<> 进行否定。我不知何故觉得!= 不起作用。
  • Rails 3 上的仅供参考的指南位于 here

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


【解决方案1】:

第二个查询实际上是在回答这个问题:查找所有至少有一条评论不是由...发表的帖子 所以看起来您的用户在 9 个帖子中发表了评论。但其他人也在这些帖子中发表了评论。

【讨论】:

  • 好的,这似乎是问题所在,但我仍然不知道如何编写将返回“所有没有由...制作的 cmets 的帖子”的语句
【解决方案2】:

按我的预期工作...

我注意到的一件事是您的查询是不同的,.user_idcmets.user_id

Post.joins(:comments).uniq.where('.user_id = ?', user.id).count # => 9
Post.joins(:comments).uniq.where('comments.user_id != ?', user.id).count # => 20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多