Module: Mongoid::Versioning

Extended by:
ActiveSupport::Concern
Defined in:
lib/mongoid/core_ext/versioning.rb,
lib/mongoid/versioning.rb,
lib/mongoid/versioning/version.rb

Overview

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.

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

VERSION =
'1.0.0'

Instance Method Summary collapse

Instance Method Details

#reviseObject

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.

Examples:

Revise the document.

person.revise

Since:

  • 1.0.0



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/mongoid/core_ext/versioning.rb', line 36

def revise
  previous = previous_revision
  if previous && versioned_attributes_changed?
    new_version = versions.build(
      previous.versioned_attributes
    )
    new_version._id = nil
    if version_max.present? && versions.length > version_max
      deleted = versions.first
      if deleted.respond_to?(:paranoid?) && deleted.paranoid?
        versions.delete_one(deleted)
        collection.find(atomic_selector).
          update({ "$pull" => { "versions" => { "version" => deleted.version }}})
      else
        versions.delete(deleted)
      end
    end
    self.version = (version || 1 ) + 1
  end
end

#revise!Object

Forces the creation of a new version of the Document, regardless of whether a change was actually made.

Examples:

Revise the document.

person.revise!

Since:

  • 2.2.1



64
65
66
67
68
69
70
71
# File 'lib/mongoid/core_ext/versioning.rb', line 64

def revise!
  versions.build(
    (previous_revision || self).versioned_attributes
  )
  versions.shift if version_max.present? && versions.length > version_max
  self.version = (version || 1 ) + 1
  save
end

#versioned_attributesHash

Filters the results of attributes by removing any fields that should not be versioned.

Returns:

  • (Hash)

    A hash of versioned attributes.

Since:

  • 2.1.0



89
90
91
# File 'lib/mongoid/core_ext/versioning.rb', line 89

def versioned_attributes
  only_versioned_attributes(attributes)
end

#versioned_attributes_changed?Boolean

Check if any versioned fields have been modified. This is similar to changed?, except this method also ignores fields set to be ignored by versioning.

Returns:

  • (Boolean)

    Whether fields that will be versioned have changed.

Since:

  • 2.1.0



100
101
102
# File 'lib/mongoid/core_ext/versioning.rb', line 100

def versioned_attributes_changed?
  !versioned_changes.empty?
end

#versioned_changesHash

Filters the results of changes by removing any fields that should not be versioned.

Returns:

  • (Hash)

    A hash of versioned changed attributes.

Since:

  • 2.1.0



79
80
81
# File 'lib/mongoid/core_ext/versioning.rb', line 79

def versioned_changes
  only_versioned_attributes(changes.except("updated_at"))
end

#versionlessObject

Executes a block that temporarily disables versioning. This is for cases where you do not want to version on every save.

Examples:

Execute a save without versioning.

person.versionless(&:save)

Returns:

  • (Object)

    The document or result of the block execution.

Since:

  • 2.0.0



113
114
115
116
117
118
# File 'lib/mongoid/core_ext/versioning.rb', line 113

def versionless
  @versionless = true
  result = yield(self) if block_given?
  @versionless = false
  result || self
end