ChartJS Chartkick按日期排列的累积图表(从不降序)

olqngx59  于 2022-11-07  发布在  Chart.js
关注(0)|答案(1)|浏览(95)

我在Chartkick中使用累积图表时遇到了一个问题。目前,在Ruby中构建图表的方式如下:

errors = Error.where(status: 'active')
sum = errors.where('first_occurrence_date <= ?', Time.zone.today - 30.days).count    
line_chart errors.group_by_day(:first_occurrence_date, last: 30).count.map { |x,y| { x => (sum += y)} }.reduce({}, :merge)

我有一个外部服务,它向我提供Rails应用程序上发生的错误,我使用API调用收集这些错误,并将它们存储在数据库中。
问题是,这些错误的状态可能是ResolvedActive。在外部平台上,当我认为我已经处理了bug时,我有可能“解决”这些错误。因此,状态从active-〉resolved
所有这些错误都有一个第一次发生的时间戳,我在此基础上构建图表。

Monday => 0 errors
Tuesday => 10 errors occurring for the first time 
Wednesday => 2 errors (which occurred on tuesday) resolved (active -> resolved) => total of 8 active errors
Thursday => 4 errors occurring for the first time
Friday => 1 error which occurred on Thursday solved, and 1 on Tuesday solved

我的图表在星期三将具有以下值

Monday => 0
Tuesday => 7
Wednesday => 7
Thursday => 10
Friday => 10

(因为我只提取图表中处于活动状态的错误)
我想要的是:

Monday => 0
Tuesday => 10
Wednesday => 8
Thursday => 12
Friday =>10

我已经想了一会儿怎么办,却找不到解决的办法,谁有办法解决这个问题?
多谢了!

taor4pac

taor4pac1#

我认为,如果只有首次发生的时间戳和当前状态,则不可能获得累积数据。

  • 如果您的错误永远不会被删除,并且唯一的操作是解决(从活动状态更改为已解决状态),则可以添加一个新字段,指示错误的解决时间。

如果错误是在某一天之前或当天创建的,并且在该天之后未解决或未解决,则该错误将被视为该天的active。因此,您的查询将是:


# Don't filter by status here

errors = Error.where('first_occurrence_date <= ?', Time.zone.today - 30.days)

day_data = (29.days.ago.to_date..Time.zone.today).to_h { |day| [day, 0] }

errors.find_each do |error|
  resolved_date = error.resolved_at&.to_date || Time.zone.tomorrow
  (error.first_occurrence_date..resolved_date).each do |day|
    day_data[day] += 1
  end
end
  • 如果错误可以被多次重新打开/解决,可以被删除,或者有多个状态,那么这种方法将是无效的。您可以考虑通过daily cronjob或类似的方式将每天的历史记录金额存储在一个新模型中,然后只查询这些金额。

Cronjob:在一天结束时运行


# first_occurrence_date doesn't matter, we only count the errors still active by the end of the day

DayReport.create(day: Time.zone.today, active_errors_count: Error.where(status: "active").count)

然后只需查询图表

line_chart DayReport.pluck(:day, :active_errors_count).to_h

相关问题