我怎么能以更高效的方式编写这段代码?

Erw*_*inM 5 sql performance ruby-on-rails-3

在我们的应用中,人们有一个或多个项目.这些项目有开始和结束日期.人们的可用天数有限.

现在我们有一个页面,以逐周显示给定人员的可用性.它目前显示18周.

我们目前计算给定周的可用时间的方式如下:

def days_available(query_date=Date.today)
  days_engaged = projects.current.where("start_date < ? AND finish_date > ?",     query_date, query_date).sum(:days_on_project)
  available = days_total - hours_engaged
end
Run Code Online (Sandbox Code Playgroud)

这意味着要显示应用程序上方描述的页面,将向数据库中触发18(!)个查询.我们有一些页面列出了表格中多人的可用性.对于这些页面,查询量很快就会变得惊人.

它也很慢.

我们如何以更高效的方式处理可用性检索?

bre*_*ick 3

在实体中处理日期范围时,这是一种非常常见的情况。简单快捷的方法是使用 SQL:

将您的事件加入到数字生成日期表中(请参阅 从日期范围生成天数),这样您就可以为一个人或多个人的每一天占用一行。一旦获得这种形式的数据,只需按日期的周日期部分进行分组并计算每个分组的行数即可。

您可以将其扩展到按人分组以进行多人查询。