module Mongoid::Undo module Version extend ActiveSupport::Concern included do include Mongoid::Document include Mongoid::Timestamps::Created field :obj_id field :obj_class field :obj_attributes, type: Hash field :version, type: Integer validates_presence_of(fields.keys - ['_id', '_type', 'created_at', 'obj_attributes']) end def obj; obj_class.constantize.find(obj_id) end def created?; version == 1 end def deleted?; !obj_attributes end def modified?; !(created? || deleted?) end def latest?(obj = nil) unless obj; obj = self.obj end obj.nil? || version == obj.version end def rollback_to(obj = nil) if !deleted? if obj.nil? || obj.id != obj_id; obj = self.obj end if obj.nil?; obj = obj_class.constantize.new end obj.versions_gt(version).each {|ver| ver.destroy } rollback(obj) else false end end private def rollback(obj = nil) old_attributes = obj.attributes obj.attributes = obj_attributes obj.without_versioning :save old_attributes end end end