在Rails中查找具有多个外键值的记录

时间:2016-02-11 08:31:57

标签: ruby-on-rails postgresql activerecord

我有两个模型用户发布其中a :user has_many :posts

如何找到超过n个帖子的用户列表?

我正在寻找像where之类的简单陈述,而不是使用范围。

3 个答案:

答案 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)