Ruby on rails活动记录多个组记录来计算数字

时间:2011-09-16 20:42:24

标签: ruby-on-rails ruby-on-rails-3 activerecord

我想计算每天命令拍摄的员工人数。

   Shoot.where("command_type = ?", "shoot").group("DATE(created_at)").group("employee_number").order("DATE(created_at)").count

它会给我一个类似

的输出
   {[Wed, 03 Aug 2011, "7838744451"]=>2, [Wed, 03 Aug 2011, "8055898284"]=>11,[Fri, 05 Aug 2011, "9702553828"]=>1, [Fri, 05 Aug 2011, "9717466677"]=>1,[Fri, 05 Aug 2011, "8055898284"]=>1,[Wed, 06 Aug 2011, "8055898284"]=>5

我希望有一个类似的数组: -

 [2,0,3,1]  // zero is for the dates when no record is there for that date. and number in the array is that number of the employees that has been ordered to shoot. 

例如来自阵列:2名员工被命令在周三,3日拍摄。  0名员工被命令在4日开枪等等......

另外:我如何计算所有员工在一周/一个月内被命令拍摄的次数。基本上100名员工被命令在第一周拍摄。 120名员工被要求第二周拍摄,第一个月和第二个月也是如此。

1 个答案:

答案 0 :(得分:1)

您使用的命令会返回员工的每日计数。如果您想获得员工的每日统计数,请删除第二次group来电。

# return [2,3,1]
Shoot.where(:command_type => shoot").group("DATE(created_at)").values

如果要填写缺失的日期值,可以使用此功能:

class Shoot
  def self.daily_count_by_type(type = "shoot", range=7.days)
    counts = Shoot.where(:command_type => type).group("DATE(created_at)").
               count("DISTINCT employee_id")
    (range.ago.to_date..Date.today).map {|d| counts[d.to_s] || 0}
  end
end

现在

Shoot.daily_count_by_type # for type `shoot`, last 7 days
Shoot.daily_count_by_type("shoot") # for type `shoot`, last 7 days
Shoot.daily_count_by_type("eat", 14.days) # for type `eat`, last 14 days
Shoot.daily_count_by_type("leave") # for type `leave`, last 14 days

确保在DATE(CREATED_AT)上添加索引以提高效果。

修改1

根据评论,您需要计算不同的值。我已相应更新了答案。