繁体   English   中英

在轨道中按日期循环遍历对象

[英]Looping through objects by date in rails

我试图遍历客户在日期范围内创建的记录,然后创建两个数组以传递给Chart.js。 第一个数组是日期范围内的每一天,第二个数组是给定日期内扫描的主机总数。

Chart.js正在寻找以下格式:

labels: ["3/11","3/12","3/13","3/14"] (一个基本数组) data: [12,13,14,55] (另一个基本数组)

在我的情况下, labels必须是给定范围内的每个日期(我现在只是在14天范围内对其进行测试;而数据将是给定日期内扫描的主机数量(可能为0)。

我可以很容易地扫描公司的总主机数:

count = 0
company.tests.each do |test|
  count += test.network_hosts.count
end

但自测试以来,我一直在努力使主机数与日期范围保持一致

我的代码正在运行,但是一天的计数减少了一个。 在这种情况下,某天(例如3/2)的结果显示在3/1以下,依此类推。

dates = []
array = []
hit = 0
today = Date.today
tests = company.tests.where(date: today - 30..today).order(date: :asc)
(today - 30..today).each{|date| dates.push(date.to_s)}
dates.each do |r|
  hit = 0
    tests.each do |t|
      if t.date.strftime("%Y-%m-%d") == r
        hit = hit + t.network_hosts.count
      end
    end
    array.push(hit)
  end
  return array
end

=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

我对Chart.js收费的日期范围数组如下所示:

today = Date.today
labels = []
(today - 30..today).each{ |date| labels.push(js_date_time_no_year(date))}
return labels

=> ["02/17", "02/18", "02/19", "02/20", "02/21", "02/22", "02/23", "02/24", "02/25", "02/26", "02/27", "02/28", "03/01", "03/02", "03/03", "03/04", "03/05", "03/06", "03/07", "03/08", "03/09", "03/10", "03/11", "03/12", "03/13", "03/14", "03/15", "03/16", "03/17", "03/18", "03/19"]

因此,第一个数组中的值17应该在位置14,而不是在位置13。 等等。 我可以通过返回31天来轻松地在代码中对此进行调整,但是理想情况下,我希望用户能够单击30/60/90天按钮,而不必执行后端数学运算来将日期范围加1。

我认为您应该保持简单。 因此可以轻松扩展它,并提高代码可读性。

这是一个功能相同的代码段

grouped_data = company.tests.joins(:network_hosts).where(date: 30.days.ago.to_date..Date.today).order(date: :asc).group_by {|test| test.date.strftime("%m/%d")}

现在

array = []
labels = []
(30.days.ago.to_date..Date.today).each do|day|
  label =  day.strftime("%d/%m")
  labels.push label
  array.push(grouped_data[label].try(:length) || 0)
end

在这里阅读有关group_by的信息

grouped_data[label].try(:length) || 0 grouped_data[label].try(:length) || 0将返回在特定日期创建公司的实际网络主机, grouped_data[label].try(:length) || 0则返回没有创建公司的那些日子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM