优化导轨中的计算

时间:2015-07-07 14:51:55

标签: sql ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

我有三个模型,Property,Visit和Session。我需要计算一个属性的平均会话时间,到目前为止我有以下方法:

在我的会话模型中:

class Session < ActiveRecord::Base
  belongs_to :property
  has_many :visits

  def session_duration
    visits.last.created_at - visits.first.created_at
  end

end

然后在我的物业模型中:

class Property < ActiveRecord::Base

  has_many :visits
  has_many :sessions

  def avg_session_duration
    @sessions = Session.where(property_id: self.id)

    (@sessions.collect(&:session_duration).sum/@sessions.length)/60 if   @sessions.length > 0
  end
end

问题在于,当我在具有数千个会话的属性上运行avg_session_duration时,计算花费的时间太长,大约几分钟。我知道必须有一种更有效的方法来做到这一点。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我想这是因为N+1 queries problem:您正在查询visits集合中每个项目的@sessions。试试includes

@sessions = Session.includes(:visits).where(property_id: self.id)