我有一个 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 中的日期范围内对 a
generate_series()
进行左连接并将空和合并为 0,但我认为这不会让我一路走好 - 一些未知的更好更优雅的选择