我试图返回一个给定的用户(current_user)活动,这些活动通过一周(最后7天)创建,并在一天一天的分组中花费在每个活动上的时间之和。
current_user has_many项目currents_user has_many活动通过:项目
对于过去7天中的每一天,我想总结一下用于活动的时间(每个活动都有存储所花费的时间),其中项目是内部的(project.internal是布尔的)。
换句话说,这就是我所需要的。今天是星期三。
今天:
昨天..。
2.days.ago ...等等在过去的7天里
模型、控制器和视图中包含了什么?
理想情况下,它需要与MySQL和SQLite一起工作。提前谢谢你。
发布于 2011-07-20 19:36:03
这样的方法最好是在模型中定义,在视图中使用。控制器实际上只用于设置东西,以便视图能够完成它的工作。
在模型中定义这些测试的优点是,您可以为它们编写单元测试,这些测试通常比功能测试或集成测试更容易设置。您的方法也很容易从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的形式返回所有值,因此您可能需要根据需要转换为数字。
https://stackoverflow.com/questions/6766596
复制相似问题