首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby和MySQL Db查询组限制

Ruby和MySQL Db查询组限制
EN

Stack Overflow用户
提问于 2011-07-20 18:24:32
回答 1查看 105关注 0票数 0

我试图返回一个给定的用户(current_user)活动,这些活动通过一周(最后7天)创建,并在一天一天的分组中花费在每个活动上的时间之和。

current_user has_many项目currents_user has_many活动通过:项目

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

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

今天:

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

昨天..。

2.days.ago ...等等在过去的7天里

模型、控制器和视图中包含了什么?

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

EN

回答 1

Stack Overflow用户

发布于 2011-07-20 19:36:03

这样的方法最好是在模型中定义,在视图中使用。控制器实际上只用于设置东西,以便视图能够完成它的工作。

在模型中定义这些测试的优点是,您可以为它们编写单元测试,这些测试通常比功能测试或集成测试更容易设置。您的方法也很容易从console命令行进行测试。

对于很多事情,您可以简单地在关系上使用sum方法。它看起来可能是这样的:

代码语言:javascript
复制
user.activities.sum(:time_spent)

可以将作用域应用到activities关系中,以便更好地针对结果。

更新

若要按不同的参数分组,始终可以将其表示为SQL联接并提取计算值。查询如下所示:

代码语言:javascript
复制
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

一旦正确设置了它,并根据需要调整了列名,就可以将其包装在一个调用中,这样就可以很容易地提取值:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6766596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档