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

ati*_*shb 7 postgresql activerecord ruby-on-rails

我有两个型号UserPost,其中一个 :user has_many :posts

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

我正在寻找一个简单的声明,where而不是使用范围.

Soo*_*ndu 6

where查询不允许像聚集函数里面算,解决这个问题的理想方法是使用having方法.

User.joins(:posts).group('users.id').having('COUNT(*) >= ?', n)
Run Code Online (Sandbox Code Playgroud)

这将映射到

SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" GROUP BY users.id HAVING COUNT(*) >= n
Run Code Online (Sandbox Code Playgroud)

通过在Post Model中使用计数器缓存并将计数保持为用户表上的posts_count列,可以更方便地使用另一种方法.

belongs_to :user, counter_cache:true 
User.where('posts_count > ?', n)
Run Code Online (Sandbox Code Playgroud)

但我更喜欢第一种方法,因为它不涉及任何数据库更改,而且非常简单