I have a model that looks like this:
class WidgetStack < ApplicationRecord
belongs_to :widget
belongs_to :person
validates :quantity, numericality: { greater_than_or_equal_to: 0, only_integer: true }
end
All the table consists of is those two foreign keys and that quantity
bigint. quantity
can only increase, and potentially changes thousands of times a day.
I want to make a record of the state of the widget_stacks
table every hour, on the hour, so that I can report on the changes to each WidgetStack
's quantity over the last hour, day, week, month, etc.
My inclination is to make a WidgetStacksHistory
model and table, and then use the whenever gem to hourly create
a WidgetStackHistory
record for every WidgetStack
.
I also found the paper_trail gem, which does model versioning, but I don't think it's for me because a WidgetStack
's quantity
changes so often and I need the record taken every hour on the hour, for every WidgetStack
at the same time. There will be a lot of WidgetStacks
, and I don't need/want to record every single change. Furthermore, since I need the exact quantity
every hour on the hour, if I used paper_trail, I'd have to record every single change to make sure that I had the latest data on the hour.
What's the "Rails way" of taking periodic snapshots of a table like this? Is my WidgetStacksHistory
+ whenever solution the way to go?
UPDATE with more info:
To clarify regarding the data: When I capture the data, it needs to fully include every WidgetStack
, so three bigints (two foreign keys plus quantity
), and the created_at
timestamp for each WidgetStack
. There will potentially be thousands of WidgetStack
s. I need to store the data with at least hourly granularity for the last day, daily granularity for the last month, and monthly granularity indefinitely.