【问题标题】:Ruby and MySQL Db query group limitRuby 和 MySQL Db 查询组限制
【发布时间】:2011-07-20 18:24:32
【问题描述】:

我正在尝试返回给定用户 (current_user) 一周内(过去 7 天)创建的活动,并按天分组,每个活动花费的时间总和。

current_user 有_many 个项目 currents_user 通过 :projects 有_many 活动

对于过去 7 天中的每一天,我想总结活动所花费的时间(每个活动都有时间字段来存储花费的时间),其中项目是内部的(project.internal 是布尔值)

换句话说,这就是我所需要的。今天是星期三。

今天:

  • 内部项目的总活动时间
  • 非内部项目的总活动时间

昨天...

2.days.ago ... 过去 7 天以此类推

模型、控制器和视图中有什么?

理想情况下,它需要与 MySQL 和 SQLite 一起使用。提前谢谢你。

【问题讨论】:

    标签: mysql ruby


    【解决方案1】:

    这样的方法最好在您的模型中定义并在您的视图中执行。控制器实际上只是用来设置一些东西,以便视图可以完成它的工作。

    在模型中定义这些的好处是您可以为它们编写单元测试,这通常比功能或集成测试更容易设置。您的方法也很容易从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,因此您可能需要根据需要转换为数字。

    【讨论】:

    • 谢谢。在我的情况下,我设法获得了 current_user.activities.sum(:time) 但是当我需要使用项目表进行范围并返回一组值(每天一个值)时,困难就来了。
    • 您只需要GROUP BY day,尽管辅助方法不支持,但您始终可以使用User.connection.select_all 从查询中提取该信息。 select_all 的参考将有助于解释。我在示例中添加了一些说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2010-09-14
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多