型号:
User
has_many posts
,post
属于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
吗?
答案 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)')