ActiveRecord组计数为零

时间:2015-09-15 06:32:07

标签: mysql sql ruby-on-rails activerecord grouping

Company.group('year(created_at)').group('month(created_at)').count
#=> {[2015, 4]=>62, [2015, 5]=>77, [2015, 6]=>61, [2015, 7]=>19, [2015, 8]=>16}

上述AR查询按年份和月份返回公司的分组数量。

问题是,它不会为公司的组返回任何条目。

我希望查询能够返回所有组,包含从月份开始的每个月,当第一家公司被创建_当前月份时,如下所示:

{[2015, 4]=>62, [2015, 5]=>77, [2015, 6]=>61, 
 [2015, 7]=>19, [2015, 8]=>16, [2015, 9]=>0} #note the last entry - it is September (9nth month) with zero companies.

我知道,MySQL需要至少一行来返回一个组。

我的需求是否确实存在变通方法?

修改

我正在寻找一种AR查询解决方案而不引入任何新表格。

1 个答案:

答案 0 :(得分:0)

您是否考虑过calendar table?虽然该网站非常陈旧,但它仍然很好地描述了这样一个表的使用:

  
      
  • 每天生成一个正在运行的销售总额,并包括您没有销售的日期,例如周末。
  •   
  • 需要按季节跟踪数据,无论这对贵公司意味着什么。
  •   
  • 需要使用滚动月份/期间来比较数据。
  •   
  

虽然许多问题都可以通过编写SQL代码来处理,但使用专用日期表会更容易。此外,可以自定义日期表以跟踪您想要的特定日期的任何信息。

因此,在您的情况下,您将创建一个这样的表,然后将其与您的Company模型一起加入。

导致类似以下的查询:

CalendarDay.where(year: Date.current.year).joins(:companies).group('YEAR(companies.created_at)').count