给定has_many <model_name>的用户,找到具有最多<model_name>的用户的正确方法是什么?</model_name> </model_name>

时间:2012-03-04 21:18:33

标签: ruby-on-rails ruby-on-rails-3

我正在编写一个应用,其中每个用户都有很多帖子。我想生成帖子最多的前3名用户列表。我能想到的唯一方法是获取所有帖子并计算每个用户拥有的数量。这似乎非常昂贵,而且不具备可扩展性。准确性很重要。有没有人有什么建议?

2 个答案:

答案 0 :(得分:2)

你可能在这里寻找一个counter_cache:查看ActiveRecord association documentation。实质上,如果在users表上有一个默认值为0的posts_count整数列,并且在关联中将:counter_cache设置为true,则Rails将自动更新该列。然后,您可以执行User.order('posts_count DESC').limit(3)之类的操作,以便为用户提供最多的帖子。

答案 1 :(得分:1)

Post.group(:user_id).order("count_all DESC").limit(3).count

应该做的工作。它按用户对帖子进行分组,在帖子数量之后对其进行排序,并返回最多帖子的3个帖子。 sql查询可能更容易理解:

(0.3ms) SELECT COUNT(*) AS count_all, user_id AS user_id FROM "posts" GROUP BY user_id ORDER BY count_all DESC LIMIT 3

和rails为你返回一个像这样的哈希:

{user_id => number_of_posts, user_id => number_of_posts, user_id => number_of_posts}