ログインしたユーザーに月ごとの統計の概要を提供するアプリケーションを開発しました。
これは私の現在のアプローチです:
Statistics.html.haml:
#(@parsed months is an array of monthnames.)
- @parsed_months.each do |month|
= render :partial => "statistic", :locals => {:month => month}
_statistic.html.haml:
%tr{:class => cycle("odd", "even")}
%td= l(month, :format => "%B").capitalize
%td= current_user.total_views_count(month)
%td= current_user.total_leads_count(month)
%td= current_user.total_clicks_count(month)
合計ビューを返すメソッド (User.rb 内):
def total_views_count(month = nil)
if month == nil
v = 0
self.companies.each {|c| v += c.counts.size}
return v
else
v = 0
self.companies.each {|c| v += c.counts.where(:created_at => Date.today.beginning_of_year..Date.today.end_of_year).where(:created_at => month.beginning_of_month..month.end_of_month).size}
return v
end
end
会社.rb:
belongs_to :user
has_many :counts, :as => :countable, :dependent => :destroy
カウント.rb:
belongs_to :countable, :polymorphic => true
ユーザー.rb:
has_many :companies
これはうまく機能していましたが、数か月後に Count モデルが 100 万件以上のレコードに成長し、heroku でリクエストのタイムアウトが発生しました。
このクエリを最適化するにはどうすればよいですか、またはこれを行うためのより良い方法はありますか?
前もって感謝します!