Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails中按日期循环对象_Ruby On Rails_Arrays_Ruby - Fatal编程技术网

Ruby on rails 在rails中按日期循环对象

Ruby on rails 在rails中按日期循环对象,ruby-on-rails,arrays,ruby,Ruby On Rails,Arrays,Ruby,我试图循环遍历客户在某个日期范围内创建的记录,然后创建两个数组传递给Chart.js。第一个数组是日期范围内的每天,第二个数组是给定日期扫描的主机总数 Chart.js正在寻找以下格式: 标签:[“3/11”、“3/12”、“3/13”、“3/14”](基本数组) 数据:[12,13,14,55](另一个基本数组) 在我的例子中,标签需要是给定范围内的每个日期(我现在只是用14天的范围进行测试;数据将是给定日期扫描的主机数量(可能是0) 我可以很容易地扫描一家公司的主机总数: count = 0

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

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

标签:[“3/11”、“3/12”、“3/13”、“3/14”]
(基本数组)
数据:[12,13,14,55]
(另一个基本数组)

在我的例子中,
标签
需要是给定范围内的每个日期(我现在只是用14天的范围进行测试;数据将是给定日期扫描的主机数量(可能是0)

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

count = 0
company.tests.each do |test|
  count += test.network_hosts.count
end
但是自从一次测试以来,我一直在努力使主机数量与日期范围保持一致

我的代码正在运行,但当天的计数减少了1。在本例中,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添加到日期范围中。

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

下面是一个与此相同的代码片段

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")}
现在

阅读有关组的信息

grouped_data[label]。try(:length)| | 0
将返回为特定日期创建公司的实际网络主机,并为未创建公司的日期返回0

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