【发布时间】:2015-07-07 14:51:55
【问题描述】:
我有三个模型,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 时,计算花费的时间太长了,大约几分钟。我知道必须有一种更有效的方法来做到这一点。任何见解将不胜感激。
【问题讨论】:
-
非规范化也值得研究。这意味着,您应该在会话行中有第一次和最后一次访问日期。当添加另一个访问时,更新上次会话缓存时间。这样,您将只需要查询会话。
标签: sql ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord