Ruby和MySQL数据库查询组限制
我试图返回一个给定用户(当前用户)在一周内(过去7天)创建的活动,并按天分组,列出每个活动花费的时间总和 当前用户有许多项目 当前用户通过项目进行了许多活动 对于过去7天中的每一天,我想总结在项目为内部(project.internal为布尔值)的活动上花费的时间(每个活动都有时间字段来存储花费的时间) 换句话说,这就是我需要的。今天是星期三 今天:Ruby和MySQL数据库查询组限制,mysql,ruby,Mysql,Ruby,我试图返回一个给定用户(当前用户)在一周内(过去7天)创建的活动,并按天分组,列出每个活动花费的时间总和 当前用户有许多项目 当前用户通过项目进行了许多活动 对于过去7天中的每一天,我想总结在项目为内部(project.internal为布尔值)的活动上花费的时间(每个活动都有时间字段来存储花费的时间) 换句话说,这就是我需要的。今天是星期三 今天: 内部项目的总活动时间 非内部项目的总活动时间 昨天 2.几天前。。。在过去的7天里,诸如此类 模型、控制器和视图中有什么 理想情况下,它需要使
- 内部项目的总活动时间
- 非内部项目的总活动时间
理想情况下,它需要使用MySQL和SQLite。提前感谢。这样的方法最好在模型中定义,并在视图中使用。控制器实际上只是用于设置视图,以便视图可以执行其工作 在模型中定义这些测试的优点是,您可以为它们编写单元测试,这通常比功能测试或集成测试更容易设置。您的方法也很容易从
控制台
命令行测试
对于很多事情,你可以简单地在你的关系上使用sum
方法。它可能看起来像这样:
user.activities.sum(:time_spent)
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
您可以将作用域应用于活动
关系,以更好地定位结果
更新
要按不同的参数组合在一起,您始终可以将其表示为SQL联接并提取计算值。查询将如下所示:
user.activities.sum(:time_spent)
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
class用户
这会将所有值返回为
String
或nil
,因此您可能需要根据需要转换为数字。谢谢。在我的例子中,我成功地获得了当前的用户.activities.sum(:time),但困难在于我需要查看projects表并返回一个值数组(每天一个值)。您只需按天分组,尽管助手方法不支持这一点,您可以始终使用User.connection。选择\u all
从查询中提取该信息。参考资料将有助于解释。我在示例中添加了一些说明。