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 

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

+0

谢谢。我设法得到current_user.activities.sum(:time),但是当我需要使用projects表作用域并返回一个值数组(每天一个值)时,会遇到困难。 – Gaelle

+0

您只需要'GROUP BY'日,虽然不支持辅助方法,但您始终可以使用User.connection.select_all从查询中提取该信息。 [select_all](http://apidock.com/rails/ActiveRecord/ConnectionAdapters/DatabaseStatements/select_all)的参考将有助于解释。我在示例中添加了一些说明。 – tadman