如何从哈希范围中获取缺少的日期

时间:2015-10-06 14:49:11

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

我从我的模型中获取了一些数据并使用.count,因此我得到了一个哈希范围。

where(:created_at => start_date.beginning_of_day..Time.zone.now.end_of_day).
    group("date(applicants.created_at)").count

输出如下:

{"2015-10-06"=>1, "2015-07-09"=>2, "2015-07-13"=>3, "2015-07-14"=>2, "2015-08-14"=>3, "2015-08-27"=>1}

问题是,我现在需要为范围之间的所有缺失日期填写日期和0值。但是,它是一个哈希,我正在努力搜索数据。

到目前为止,我所拥有的并没有找到该范围内的日期;永远。

def dates_chart_series(orders, start_date, end_date)
  orders_by_day = orders
    .where(:created_at => start_date.beginning_of_day..Time.zone.now.end_of_day)
    .group("date(applicants.created_at)")
    .count

  puts orders_by_day

  (start_date.to_date..end_date.to_date).map do |date|
    puts orders_by_day.select { |key, value|  key == date  }
    puts date
  end.inspect
end

上面的代码取自RailsCast,其中返回了一个对象(或对象数组)。不是哈希。我试图使用.select来调整它,但我没有太多运气。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

result = (start_date.to_date..end_date.to_date).each_with_object({}) do |date, hash|
  hash[date] = orders_by_day.fetch(date.to_s, 0)
end

如果日期不存在,应该返回一个新的哈希值,每个日期作为键,0作为默认值。