Sql 钢轨优化计算
我有三个模型,财产,参观和会议。我需要计算属性的平均会话时间,到目前为止,我有以下方法: 在我的会话模型中:Sql 钢轨优化计算,sql,ruby-on-rails,ruby-on-rails-4,activerecord,rails-activerecord,Sql,Ruby On Rails,Ruby On Rails 4,Activerecord,Rails Activerecord,我有三个模型,财产,参观和会议。我需要计算属性的平均会话时间,到目前为止,我有以下方法: 在我的会话模型中: class Session < ActiveRecord::Base belongs_to :property has_many :visits def session_duration visits.last.created_at - visits.first.created_at end end 类会话
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
class属性0
结束
结束
问题是,当我在具有数千个会话的属性上运行
avg_session_duration
时,计算时间太长,以分钟为单位。我知道必须有一个更有效的方法来做到这一点。任何洞察都将不胜感激。我想这是因为:您正在查询@sessions
集合中每个项目的访问量。尝试:
我相信它甚至会是一个带有连接的单一查询,不是吗?谢谢,使用includes比我拥有的要好得多@SergioTulentsev:事实上,当我在我的项目中运行包含时,与有许多关联,ActiveRecord构建了两个查询..文档说使用包含通常会导致使用连接,但以我拙劣的经验来看,只有当我使用引用
或where
方法中关联表的引用条件强制它时,事情才会这样发展。反规范化也值得研究。也就是说,在会话行中应该有第一次和最后一次访问的日期。添加另一次访问时,更新上次会话缓存时间。这样,您将只能查询会话。
@sessions = Session.includes(:visits).where(property_id: self.id)