Rails在has_many上加入no或0 count

时间:2017-08-31 15:55:08

标签: sql ruby-on-rails

型号: User has_many postspost属于user

我希望找到没有发布帖子的用户。

我试过了:

User.joins(:posts).where(posts: { published: true }).group('users.id').having('count(posts.id) = 0')

但是当用户没有发布帖子时,我猜测posts.id为空,因此它不会返回任何用户记录。

当我执行的操作超过0 'count(posts.id) > 0'时,它的工作正常。我可以使用另一种SQL方法而不是count吗?

1 个答案:

答案 0 :(得分:1)

使用Postgres 9.6

在Rails 5.0.2上测试

您可以尝试此查询:

for (i in 1:l) { 

  n <- nrow(sample_data_2[[i]]) 

  cor <- matrix(ncol = n, nrow = n)

  col_2 <- sample_data_2[[i]][,2]
  col_3 <- sample_data_2[[i]][,3]

  cor <- diag(n) +
    0.5 * (outer(col_2, col_2, "!=") & outer(col_3, col_3, "==")) +
    0.25 * (outer(1:n, 1:n, "!=") & (outer(col_2, col_2, "==") + outer(col_3, col_3, "==")) != 1) + 
    outer(col_3,col_3,function(x,y) sin(x-y))  * (outer(col_2, col_2, "==") & outer(col_3, col_3, "!="))

  mat_list[[i]] <- cor    

}

mat_list
#[[1]]
#         [,1]      [,2]
#[1,] 1.000000 -0.841471
#[2,] 0.841471  1.000000
#
#[[2]]
#         [,1]      [,2]     [,3]      [,4]
#[1,] 1.000000 -0.841471 0.250000  0.250000
#[2,] 0.841471  1.000000 0.500000  0.250000
#[3,] 0.250000  0.500000 1.000000 -0.841471
#[4,] 0.250000  0.250000 0.841471  1.000000

输出SQL将如下所示:

User.where.not(id: Post.where(published: true).distinct.select(:user_id))

请注意,此查询还包括用户,而不包含任何帖子。如果您不想加载此类用户,可以修改如下查询:

SELECT users.* 
FROM users
WHERE users.id NOT IN (
    SELECT DISTINCT posts.user_id FROM posts WHERE posts.published = true
)

输出SQL将如下所示:

User.where.not(id: Post.where(published: true).distinct.select(:user_id))
  .where('EXISTS (SELECT user_id from posts WHERE user_id = users.id)')