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)