【问题标题】:How can I get the missing dates from a hash range如何从哈希范围中获取缺失的日期
【发布时间】:2015-10-06 14:49:11
【问题描述】:

我从我的模型中获取一些数据并使用.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 对其进行调整,但运气不佳。

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:
    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 作为默认值。

    【讨论】:

    • 谢谢!尽管每个 with object 似乎都不起作用,但我已经结束了: hash = Hash.new (start_date.to_date..end_date.to_date).each do |date| hash[date] = orders_by_day.fetch(date.to_s, 0) 结束
    • 酷,啊,我像往常一样把参数|hash, date|弄错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多