Module: MongoidVersioning::Versioned

Defined in:
lib/mongoid_versioning/versioned.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/mongoid_versioning/versioned.rb', line 4

def self.included base
  base.extend ClassMethods
  base.class_eval do
    define_model_callbacks :revise, only: [:before, :after]

    field :_version, type: Integer
    field :_based_on_version, type: Integer

    versions_collection.indexes.create_one(
      { _orig_id: 1, _version: 1 }, { unique: true }
    )

    class_attribute :version_max

    before_create :set_initial_version
    after_initialize :revert_id
  end
end

Instance Method Details

#latest_versionObject



71
72
73
# File 'lib/mongoid_versioning/versioned.rb', line 71

def latest_version
  self.class.where(_id: id).first
end

#previous_versionsObject



75
76
77
78
79
80
# File 'lib/mongoid_versioning/versioned.rb', line 75

def previous_versions
  self.class.with(collection: self.class.versions_collection_name).
    where(_orig_id: id).
    ne(_version: latest_version._version).
    desc(:_version)
end

#revise(options = {}) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/mongoid_versioning/versioned.rb', line 41

def revise options={}
  return save if new_record?

  return false if performing_validations?(options) && invalid?(:update)
  process_flagged_destroys
  result = run_callbacks(:revise) do
    run_callbacks(:save) do
      run_callbacks(:update) do
        _revise
        true
      end
    end
  end
  post_process_persist(result, options) and self
end

#revise!(options = {}) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/mongoid_versioning/versioned.rb', line 57

def revise! options={}
  unless revise(options)
    fail_due_to_validation! unless errors.empty?
    fail_due_to_callback!(:revise!)
  end
  true
end

#version(v) ⇒ Object



82
83
84
85
# File 'lib/mongoid_versioning/versioned.rb', line 82

def version v
  return latest_version if v == _version
  previous_versions.where(_version: v).first
end

#versionsObject




67
68
69
# File 'lib/mongoid_versioning/versioned.rb', line 67

def versions
  [latest_version].concat(previous_versions)
end