我有三个模型,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
时,计算花费的时间太长,大约几分钟。我知道必须有一种更有效的方法来做到这一点。任何见解都将不胜感激。
答案 0 :(得分:2)
我想这是因为N+1 queries problem:您正在查询visits
集合中每个项目的@sessions
。试试includes
:
@sessions = Session.includes(:visits).where(property_id: self.id)