Ruby和MySQL Db查询组限制

时间:2011-07-20 18:24:32

标签: mysql ruby

我正在尝试返回通过本周(过去7天)创建的给定用户(current_user)活动以及每天所花费的时间总和。

current_user has_many项目 currents_user has_many活动通过:projects

对于过去7天中的每一天,我想总结花在活动上的时间(每个活动都有时间字段来存储花费的时间)项目是内部的(project.internal是布尔值)

换句话说,这就是我需要的。今天是星期三。

今天:

  • 内部项目的总活动时间
  • 非内部项目的总活动时间

昨天......

2.days.ago ...过去7天等等

模型,控制器和视图中包含哪些内容?

理想情况下,它需要使用MySQL和SQLite。提前谢谢。

1 个答案:

答案 0 :(得分:0)

此类方法最好在您的模型中定义,并在您的视图中进行操作。控制器只能用于设置,以便视图可以正常工作。

在模型中定义这些的优点是,您可以为它们编写单元测试,这些测试通常比功能或集成测试更容易设置。您的方法也很容易从console命令行进行测试。

对于很多事情,你可以简单地对你的人际关系进行sum方法。它可能看起来像这样:

user.activities.sum(:time_spent)

您可以将范围应用于activities关系,以更好地定位结果。

<强>更新

要按不同参数组合在一起,您始终可以将其表示为SQL连接并提取计算值。查询看起来像这样:

SELECT users.id, projects.internal, SUM(activities.time) AS total_time, activities.on_date
  FROM users
  LEFT JOIN projects ON projects.user_id=users.id
  LEFT JOIN activities ON activities.project_id=projects.id
  GROUP BY users.id, projects.internal, activities.on_date

如果您已正确设置,根据需要调整列名称,您可以将其包装在一个可以轻松提取值的调用中:

class User < ActiveRecord::Base
  def self.time_spent_on_projects(user_id = nil)
    query = "..." # Query from above

    # Allow scoping to a particular user by adding a WHERE clause
    query = self.sanitize_sql([ "#{query} WHERE users.id=?", user_id ])

    self.connection.select_all(query)
  end

  def time_spent_on_projects
    self.class.time_spent_on_projects(self.id)
  end
end

这会将所有值都返回为Stringnil,因此您可能需要根据需要转换为数字。