data_snapshots
Simple, flexible data snapshotting for your Rails app.
Installation
Run the following command to add data_snapshots
to your Gemfile:
bundle add data_snapshots
Once installed, copy and run the migration:
bundle exec rails data_snapshots_engine:install:migrations
bundle exec rails db:migrate
Registering a model snapshot
A model snapshot is a collection of methods that run against a model instance. Methods will be passed the instance when the snapshot is generated.
You can register your snapshots in an initializer:
DataSnapshots.configure do |c|
c.register_snapshot name: :user_assignments do |methods|
methods[:total] = ->(instance) { instance.assignments.count }
methods[:total_complete] = ->(instance) { instance.assignments.where(complete: true).count }
end
end
Registering a generic snapshot
A generic snapshot is a collection of methods that will not be passed a model instance when the snapshot is generated. You can declare a snapshot as generic by passing model: false
as an argument when registering the snapshot:
DataSnapshots.configure do |c|
c.register_snapshot name: :totals, model: false do |methods|
methods[:total_users] = ->() { User.count }
methods[:total_assignments] = ->() { Assignments.count }
end
end
Generating model snapshots
Model snapshots can either be generated on the individual instance:
user = User.last
user.generate_snapshot(name: :user_assignments)
Or you can generate them with a collection of records:
DataSnapshots.generate_snapshots(name: :user_assignments, collection: User.all)
Generating generic snapshots
Generic snapshots can be created by passing the name of the snapshot to DataSnapshots.generate_snapshot
DataSnapshots.generate_snapshot(name: :total_users)
Fetching snapshots
data_snapshots
comes with a <NAME>_snapshots
method so its easy to fetch all the snapshots taken against a particular instance:
user.user_assignments_snapshots
You can fetch your generic snapshots by calling DataSnapshots.fetch_snapshots
and passing the name of your snapshot:
DataSnapshots.fetch_snapshots(name: :total_users)
This method can also be used to fetch ALL model snapshots with the given name.
Viewing snapshot data
Snapshot data is stored as JSON in the database and can be accessed easily:
snapshot.data # => { 'key' => 'value' }
License
The gem is available as open source under the terms of the MIT License.