No commit activity in last 3 years
No release in over 3 years
Adds the options to push changes to a list instead of changing the document. This list can then be handled later to update the real model.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.10
~> 10.0
>= 0

Runtime

~> 5.0.0
 Project Readme

Mongoid::PendingChanges

Build Status

Gem Version

Mongoid::PendingChanges adds an option to keep further changes from modifying the record, pushing them to a changelist instead.

This is an initial effort to develop an approval system to control changes to collections.

Change Log

v0.4.0: Creating the appendable helper, which flags an Array field as a collection of values. When applying changes for appendable fields, instead of replacing them.

v0.3.0: Adding methods '#apply_change' and '#reject_change'

v0.2.0a: Adding method #get_change_number, which returns the change from the changelist with the specified number

v0.1.2: Fixing a bug where records created before the gem was used would cause an exception due to the required fields being nil.

Installation

Add this line to your application's Gemfile:

gem 'mongoid-pending_changes'

And then execute:

$ bundle

Or install it yourself as:

$ gem install mongoid-pending_changes

Usage

Add the following line to the models you want to track

class Model
    include Mongoid::PendingChanges
    
    field :example, type: String
end

Then, when you want to have changes that require approval, call

model.push_for_approval {example: 'new example value'}

Your model will keep the original value, but a new entry will be added to the changelist property, with all changes and an incrementing ID.

If you need to recover a specific change from the changelist, you can use

change = model.get_change_number 1   

Then you can use change[:data][:example] == 'new example value', for example.

If you want to apply a change to the model, you can call

model.apply_change 1   

Then you can use model.example == 'new example_value'. Also, model.changelist[1][:backup] will store the old value, if there was one.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/matheus208/mongoid-pending_changes.

TODO list

  • Create a class to represent a "Change" (instead of using arrays)
  • Make appendable work for Hashes.
  • Create options for appendable, like: whether or not it merges two arrays (or it just appends the second array to the first, creating a nested array), how to make a change remove or replace the field, instead of appending to it, etc...
  • Have a conversion modifier parameter when applying changes. E.g.: when applying change, pass a block that will receive the change data as a parameter, and could modify it (useful for converting between different versions maybe?)
  • Test if it works on relations. (I.e. change with a relation swap)
  • Enforce type on changes.
  • ... Complete the TODO list