lib/mongoid/versioning.rb in mongoid-2.0.0.beta.20 vs lib/mongoid/versioning.rb in mongoid-2.0.0.rc.1
- old
+ new
@@ -1,42 +1,51 @@
# encoding: utf-8
module Mongoid #:nodoc:
+
# Include this module to get automatic versioning of root level documents.
# This will add a version field to the +Document+ and a has_many association
# with all the versions contained in it.
module Versioning
extend ActiveSupport::Concern
included do
field :version, :type => Integer, :default => 1
- embeds_many :versions, :class_name => self.name
+ embeds_many :versions, :class_name => self.name, :validate => false
set_callback :save, :before, :revise
- end
- module ClassMethods #:nodoc:
- attr_accessor :version_max
-
- # the number of max_version should >= 0
- def max_versions(number)
- self.version_max = number.to_i
- end
+ delegate :version_max, :to => "self.class"
end
# Create a new version of the +Document+. This will load the previous
# document from the database and set it as the next version before saving
# the current document. It then increments the version number. If a #max_versions
# limit is set in the model and it's exceeded, the oldest version gets discarded.
+ #
+ # @example Revise the document.
+ # person.revise
def revise
last_version = self.class.first(:conditions => { :_id => id, :version => version })
if last_version
- old_versions = ( @attributes['versions'].duplicable? ? @attributes['versions'].dup : nil )
- self.versions << last_version.clone
- if self.class.version_max.present? && ( self.class.version_max >= 0 ) && ( self.versions.length > self.class.version_max )
- self.versions.shift
- @attributes['versions'].shift
- end
+ versions.target << last_version.clone
+ versions.shift if version_max.present? && versions.length > version_max
self.version = (version || 1 ) + 1
- @modifications["versions"] = [ old_versions, @attributes['versions'] ] if @modifications
+ @modifications["versions"] = [ nil, versions.to_hash ] if @modifications
+ end
+ end
+
+ module ClassMethods #:nodoc:
+ attr_accessor :version_max
+
+ # Sets the maximum number of versions to store.
+ #
+ # @example Set the maximum.
+ # Person.max_versions(5)
+ #
+ # @param [ Integer ] number The maximum number to store.
+ #
+ # @return [ Integer ] The max number of versions.
+ def max_versions(number)
+ self.version_max = number.to_i
end
end
end
end