2017-09-01 39 views
0

我有一個has_many文章的用戶。我使用計數器緩存來存儲用戶發佈的文章數量。Rails Active Record - 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中的數據用於此目的?

回答

0

這似乎是稍微整齊:

User. 
joins(:articles). 
where('articles.created_at >= ?', 1.week.ago.utc). 
group('articles.user_id'). 
order("count(*) desc"). 
limit(50) 
1

如何:

Article. 
    includes(:user). 
    where('created_at >= ?', 1.week.ago.utc). 
    group(:user). 
    order("count(*) desc"). 
    limit(50). 
    count 

它給你一個哈希其中的關鍵是用戶,該值是文章的數量,對排名前50位用戶通過文章數量,並且將垃圾分類按文章數量降序排列。

將索引放在created_at,也可能是user_id

+0

感謝大衛。不知何故,我認爲可能有ActiveRecord的方式來實現它,但無論如何,你的建議比我的原始方法更好。 –

相關問題