我有两个模型用户和发布其中a
:user
has_many :posts
如何找到超过n
个帖子的用户列表?
我正在寻找像where
之类的简单陈述,而不是使用范围。
答案 0 :(得分:6)
where
查询不允许聚合函数(如count内),解决此问题的理想方法是使用having
方法。
User.joins(:posts).group('users.id').having('COUNT(*) >= ?', n)
这将映射到
SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" GROUP BY users.id HAVING COUNT(*) >= n
通过在Post Model中使用计数器缓存并将计数保留为用户表上的posts_count列,可以更容易地实现另一种方法。
belongs_to :user, counter_cache:true
User.where('posts_count > ?', n)
但我更喜欢第一种方法,因为它不涉及任何数据库更改并且非常简单
答案 1 :(得分:1)
belongs_to :user, counter_cache:true # Inside the Post model
另一种解决方法是使用counter_cache并在user表上添加posts_count列。
User.where('posts_count > ?', n)
然后你可以做
<div id="personal-details">
答案 2 :(得分:-1)
试试这个:
User.where('id IN (SELECT user_id
FROM posts
GROUP BY user_id
HAVING COUNT(*) > ?
)', n)