我在使用 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 呼叫收集它們并將它們存盤在資料庫中。
問題是,這些錯誤可能具有狀態Resolved或Active. 在外部平臺上,當我認為我已經處理了錯誤時,我有可能“解決”錯誤。因此狀態從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
我想了一會兒該怎么做,但無法找到解決方案,有人對如何解決這個問題有任何想法嗎?
非常感謝 !
uj5u.com熱心網友回復:
我認為如果您只有第一次發生的時間戳和當前狀態,則不可能獲得累積資料。
- 如果您的錯誤永遠不會被洗掉并且唯一的操作是解決(從活動狀態更改 -> 已解決狀態),您可以添加一個新欄位,指示錯誤何時解決。
如果錯誤是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
- 如果錯誤可以多次重新打開/解決,可以洗掉,或者具有多個狀態,但是這種方法將無效。您可以考慮通過每日 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489085.html
