Mongoid Genesis
Mongoid Genesis will give you the ability to override data in your model without losing the initial data.
Install
gem install mongoid-genesis
Rails 3
In your Gemfile:
gem 'mongoid-genesis'
Usage
Mongoid Genesis is compatible with any mongoid collection or embedded object.
Model integration
class Book
include Mongoid::Document
include Mongoid::Genesis
end
This will create an embedded object that will store the original data.
Basic structure
book = Book.new(:title => 'The Art of War', :author => 'Sun Tzu')
#=> #<Book _id: 1, title: "The Art of War", author: "Sun Tzu">
book.genesis
#=> #<BookGenesis _id: 1>
Preserve the original attribute
book.write_and_preserve_attribute(:author, 'Sun Zi')
#=> #<Book _id: 1, title: "The Art of War", author: "Sun Zi">
book.genesis
#=> #<BookGenesis _id: 1, author: "Sun Tzu">
After preserving the original attribute, it will not be overwritten
book.write_and_preserve_attribute(:author, 'Sun Wu')
#=> #<Book _id: 1, title: "The Art of War", author: "Sun Wu">
book.genesis
#=> #<BookGenesis _id: 1, author: "Sun Tzu">
At all time, you can read the original attribute
book.read_attribute_genesis(:title)
#=> "The Art of War"
book.write_and_preserve_attribute(:title, 'The Art of Peace')
book.read_attribute_genesis(:title)
#=> "The Art of War"
You can restore the original attribute
book.restore_genesis(:author)
#=> #<Book _id: 1, title: "The Art of War", author: "Sun Tzu">
book.genesis
#=> #<BookGenesis _id: 1, author: nil>
To update the original document without losing the current state
book.write_and_preserve_attribute(:title, 'The Art of Peace')
book.reverse_genesis
#=> #<Book _id: 1, title: "The Art of War", author: "Sun Tzu">
#=> #<BookGenesis _id: 1, title: "The Art of Peace">
book.title = "The Art of War : Revisited"
book.reverse_genesis
#=> #<Book _id: 1, title: "The Art of Peace", author: "Sun Tzu">
#=> #<BookGenesis _id: 1, title: "The Art of War : Revisited">
Cheat Sheet
read_attribute_genesis(field_name)
Read the original attribute of the record. If the attribute wasn't overwritten, it will return the same thing as .read_attribute.
restore_genesis(field_name)
Restore the original value for the given field
reverse_genesis
Restore the record to its original state
write_and_preserve_attribute(field_name, value)
Overwrite the attribute with the value and saves the original value in the genesis object.
Copyright
Copyright (c) 2012 De Marque inc. See LICENSE for further details.