Ruby on rails Rails日期范围JSON数据

Ruby on rails Rails日期范围JSON数据,ruby-on-rails,json,ruby-on-rails-3.2,Ruby On Rails,Json,Ruby On Rails 3.2,我希望有一个从1.month.ago..date.today到1.month.ago..date.today的日期范围,然后为每天选择最高温度(因此应该有30个单独的数字),然后总结结果 我以JSON格式获取数据,其结构如下 {"status": "ok", "data": [{"temperature": 22.4, "date": "20160815-0345"}} 我通过循环解析数据 @data['data'].each do |d| maxTotal << [DateTi

我希望有一个从
1.month.ago..date.today
1.month.ago..date.today的日期范围,然后为每天选择最高温度(因此应该有30个单独的数字),然后总结结果

我以JSON格式获取数据,其结构如下

{"status": "ok", "data": [{"temperature": 22.4, "date": "20160815-0345"}}
我通过循环解析数据

@data['data'].each do |d|
 maxTotal << [DateTime.parse(d['date']), d['temperature']]
end
@data['data'],每个都有|
maxTotal已更新:已测试并正常工作
解释(分解)
更新:测试和工作
解释(分解)

谢谢Jay,你能解释一下h.second.max_中second的用法吗?这似乎是一天中的第二个记录,而不是最大值。@DollarChills ohh不,
。second
指变量
h
中的第二个,其中
h
是一个大小为2的数组,如上图所示。您会注意到,
h.first
是键,
h.second
是对应的值。这是因为inject()循环遍历散列中的每个键值对(请参阅上面的第2部分)散列),然后
h
变成类似于[key,value]数组的东西,而不是散列{key:value}。这就是为什么
h.second
再次引用键所指的值(键是日期,值是:temperature和:Date的散列数组;见上文)希望这有助于解释。看起来很好用。非常感谢你的帮助@多拉奇尔不用担心。很高兴能帮上忙:)谢谢Jay,你能解释一下h.second.max_中second的用法吗?这似乎是一天中的第二个记录,而不是最大值。@DollarChills ohh不,
。second
指变量
h
中的第二个,其中
h
是一个大小为2的数组,如上图所示。您会注意到,
h.first
是键,
h.second
是对应的值。这是因为inject()循环遍历散列中的每个键值对(请参阅上面的第2部分)散列),然后
h
变成类似于[key,value]数组的东西,而不是散列{key:value}。这就是为什么
h.second
再次引用键所指的值(键是日期,值是:temperature和:Date的散列数组;见上文)希望这有助于解释。看起来很好用。非常感谢你的帮助@多拉奇尔不用担心。很高兴能帮上忙:)
@total = maxTotal { |a| a[0].to_date == (1.month.ago.to_date) }.max { |a,b| a[1] <=> b[1] }.sum[1]
json_data = @data['data']
sum_of_max_temperature_in_each_day = json_data.
  group_by{ |h| Date.parse(h[:date]) }.
  reject{ |k, v| !( ((30.days.ago.to_date)..(Date.today)) === k ) }.
  inject(0){ |sum, h| sum + h.second.max_by{ |h| h[:temperature] }[:temperature] }
# Example; let json_data be
json_data = [
  {"temperature": 22.4, "date": "20160815-0345"},
  {"temperature": 10.4, "date": "20160815-1435"},
  {"temperature": 15.8, "date": "20990101-0430"},
  {"temperature": 4, "date": "20160816-0101"}
]

# sum of max temperature each day within last 30 days
puts json_data.
  group_by{ |h| Date.parse(h[:date]) }.
  reject{ |k, v| !( ((30.days.ago.to_date)..(Date.today)) === k ) }.
  inject(0){ |sum, h| sum + h.second.max_by{ |h| h[:temperature] }[:temperature] }
=> 26.4

# 1) Group by day
puts json_data.
  group_by{|h| Date.parse( h[:date] )}
{
  Mon, 15 Aug 2016=>[
    {:temperature=>22.4, :date=>"20160815-0345"},
    {:temperature=>10.4, :date=>"20160815-1435"}
  ],
  Thu, 01 Jan 2099=>[
    {:temperature=>15.8, :date=>"20990101-0430"}
  ],
  Tue, 16 Aug 2016=>[
    {:temperature=>4, :date=>"20160816-0101"}
  ]
}

# 2) Remove those not within the last 30 days
puts json_data.
  group_by{ |h| Date.parse(h[:date]) }.
  reject{ |k, v| !( ((30.days.ago.to_date)..(Date.today)) === k ) }

{
  Mon, 15 Aug 2016=>[
   {:temperature=>22.4, :date=>"20160815-0345"},
   {:temperature=>10.4, :date=>"20160815-1435"}
  ],
  Tue, 16 Aug 2016=>[
    {:temperature=>4, :date=>"20160816-0101"}
  ]
}

# 3) Showing what's happening inside the inject() block.
puts json_data.
  group_by{ |h| Date.parse(h[:date]) }.
  reject{ |k, v| !( ((30.days.ago.to_date)..(Date.today)) === k ) }.
  inject(0){ |sum, h| 
    puts "h ==> #{h}";
    puts "h.second ==> #{h.second}";
    puts "h.second.max_by ==> #{h.second.max_by{ |h| h[:temperature] }[:temperature]}"
  }

h ==> [
  Mon, 15 Aug 2016,
  [
    {:temperature=>22.4, :date=>"20160815-0345"},
    {:temperature=>10.4, :date=>"20160815-1435"}
  ]
]
h.second ==> [
  {:temperature=>22.4, :date=>"20160815-0345"},
  {:temperature=>10.4, :date=>"20160815-1435"}
]
h.second.max_by ==> 22.4
h ==> [
  Tue, 16 Aug 2016, 
  [
    {:temperature=>4, :date=>"20160816-0101"}
  ]
]
h.second ==> [
  {:temperature=>4, :date=>"20160816-0101"}
]
h.second.max_by ==> 4