Rails Active Record - counter_cache仅在给定的时间段内返回记录

时间:2017-09-01 16:26:15

标签: ruby-on-rails database activerecord counter-cache

我有一个有很多文章的用户。我使用计数器缓存来存储用户发布的文章数量。

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中存储的数据用于此目的?

2 个答案:

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