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
# 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(
      { _orig_id: 1, _version: 1 }, { unique: true }
    )

    before_create :set_initial_version
    after_initialize :revert_id
  end
end

Instance Method Details

#latest_versionObject



65
66
67
# File 'lib/mongoid_versioning/versioned.rb', line 65

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

#previous_versionsObject



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

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

#revise(options = {}) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/mongoid_versioning/versioned.rb', line 35

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



51
52
53
54
55
56
57
# File 'lib/mongoid_versioning/versioned.rb', line 51

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

#version(v) ⇒ Object



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

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

#versionsObject




61
62
63
# File 'lib/mongoid_versioning/versioned.rb', line 61

def versions
  [latest_version].concat(previous_versions)
end