我正在尝试返回通过本周(过去7天)创建的给定用户(current_user)活动以及每天所花费的时间总和。
current_user has_many项目 currents_user has_many活动通过:projects
对于过去7天中的每一天,我想总结花在活动上的时间(每个活动都有时间字段来存储花费的时间)项目是内部的(project.internal是布尔值)
换句话说,这就是我需要的。今天是星期三。
今天:
昨天......
2.days.ago ...过去7天等等
模型,控制器和视图中包含哪些内容?
理想情况下,它需要使用MySQL和SQLite。提前谢谢。
答案 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
这会将所有值都返回为String
或nil
,因此您可能需要根据需要转换为数字。