0

我有一个 rails 4 (ruby 2) 应用程序,可以跟踪员工对不同公司的时间。我需要得到每个公司每个日期的分钟总和。我的问题是,如果那天没有该公司的时间条目,我不确定用 0 填充日期/公司对的最佳方法。

Companies      Time_Entries
id name ...    id, created_at, company_id, minutes ...

仅给定 2 家公司和 2 天的当前输出,

[{"company_id":1,"company_name":"Company A","date":"2013-06-24","minutes":987},
 {"company_id":1,"company_name":"Company A","date":"2013-06-25","minutes":5},
 {"company_id":2,"company_name":"Company B","date":"2013-06-24","minutes":500}]

预期的输出是填充未记录为 0 的天数是在列表中添加一个附加项目,其中最后一个项目是新项目。

[{"company_id":1,"company_name":"Company A","date":"2013-06-24","minutes":987},
 {"company_id":1,"company_name":"Company A","date":"2013-06-25","minutes":5},
 {"company_id":2,"company_name":"Company B","date":"2013-06-24","minutes":500},
 {"company_id":2,"company_name":"Company B","date":"2013-06-25","minutes":0}]

当前查询 (PostgreSQL)

 @minutes = TimeEntry.where("created_at >= ?", 1.week.ago.utc)
  .group('companies.id, date(created_at)')
  .joins(:company)
  .select("companies.id as company_id", "companies.name as company_name", "date(created_at)", "SUM(minutes) as minutes")
  .order("date ASC")

我不确定解决这个问题的最佳方法。我可以想到几个选项:

  • 一个 3 深度循环,循环几天,而不是循环通过公司,而不是循环通过找到的结果添加任何尚未添加的日期/公司对。
  • 在 postgresq 中的日期范围内对 agenerate_series()进行左连接并将空和合并为 0,但我认为这不会让我一路走好
  • 一些未知的更好更优雅的选择
4

0 回答 0