Ruby和MySQL Db查询组限制
问题描述:
我试图返回给定用户(current_user)通过一周(最近7天)创建的活动,并按每天花费的时间总和进行分组。Ruby和MySQL Db查询组限制
CURRENT_USER的has_many项目 currents_user的has_many活动,通过:项目
对于每一个过去的7天,我想总结一下花在活动(每个活动都有时间字段存储所花费的时间)时间,其中项目是内部( project.internal是布尔型)
换句话说,这就是我所需要的。今天是星期三。
今天:
- 总活动时间进行内部项目
- 总活动时间不是内部项目
昨天...
2.days.ago ...在过去7天后依次类推
模型中有什么,控制r和意见?
理想情况下,它需要使用MySQL和SQLite。先谢谢你。
答
这样的方法在您的模型中最好定义并在您的视图中执行。控制器只能真正起作用,以便视图可以完成工作。
在模型中定义这些元素的好处是可以为它们编写单元测试,通常比功能或集成测试更易于设置。您的方法也很容易从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
这将返回所有值为String
或nil
,因此您可能需要根据需要转换为数字。
谢谢。我设法得到current_user.activities.sum(:time),但是当我需要使用projects表作用域并返回一个值数组(每天一个值)时,会遇到困难。 – Gaelle
您只需要'GROUP BY'日,虽然不支持辅助方法,但您始终可以使用User.connection.select_all从查询中提取该信息。 [select_all](http://apidock.com/rails/ActiveRecord/ConnectionAdapters/DatabaseStatements/select_all)的参考将有助于解释。我在示例中添加了一些说明。 – tadman