我有一个有很多文章的用户。我使用计数器缓存来存储用户发布的文章数量。
class User < ActiveRecord::Base
has_many :articles
end
class Article < ActiveRecord::Base
belongs_to :user, :counter_cache => true
end
我使用以下语法查找已发布大多数文章的用户:
User.order( "articles_count desc" ).limit(50).all
我想做的是检查过去一个月发布过大多数文章的50位顶级用户。
我知道我可以获得每个用户上个月发布的文章数量,但它感觉不是很有效:
User.find_each do |user|
user.articles.where('created_at >= ?', 1.week.ago.utc).count
end
我尝试了一些没有太多运气的SQL查询,并想知道是否有一种方法可以使用我的counter_cache中存储的数据用于此目的?
答案 0 :(得分:1)
这个怎么样:
Article.
includes(:user).
where('created_at >= ?', 1.week.ago.utc).
group(:user).
order("count(*) desc").
limit(50).
count
它为您提供了一个哈希,其中密钥是用户,值是文章数量,按文章数量排在前50位用户,并按文章计数的降序排序。
将索引放在created_at
上,也可以user_id
。
答案 1 :(得分:0)
这似乎有点整洁:
User.
joins(:articles).
where('articles.created_at >= ?', 1.week.ago.utc).
group('articles.user_id').
order("count(*) desc").
limit(50)