Rails - 查找没有任何具有特定值的子项的所有条目

时间:2013-07-06 01:20:09

标签: ruby-on-rails activerecord

我们正在尝试创建一个ActiveRecord查询,为了理解,可以将其简化为博客示例。我们如何才能找到特定用户没有留下任何评论的所有博文?

我们当前的查询会返回帖子,只要某些评论不是特定用户,但如果该用户编写了任何评论,我们需要排除博客帖子。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

最合适的sql语法是“not exists”子句。外连接也很受欢迎,但这往往是出于历史原因,因为RDBMS查询优化器过去并不擅长为涉及许多记录的查询优化它们。

现在,一个体面的优化器可以使用一个不存在的查询来使用适当的东西,例如散列数据的散列反连接。

查询将是......

select *
from   posts
where  not exists (
         select null
         from   comments
         where  comments.post_id = posts.id and
                comments.user_id = 38)

在轨道说话......

Post.where("not exists (select null from comments where comments.post_id = posts.id and comments.user_id = #{user.id}")

更新:

rails中更好的语法:

Post.where.not(Comment.where("comments.post_id = posts.id").where(:user_id => user.id}).exists)

答案 1 :(得分:2)

Post.joins("LEFT JOIN comments ON posts.id = comments.post_id AND user_id = #{user_id}").where("comments.id IS NULL")