Module: Mongoid::Delorean::Trackable

Defined in:
lib/mongoid/delorean/trackable.rb

Defined Under Namespace

Modules: CommonEmbeddedMethods, CommonInstanceMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



5
6
7
8
9
10
11
# File 'lib/mongoid/delorean/trackable.rb', line 5

def self.included(klass)
  super
  klass.field :version, type: Integer, default: 0
  klass.before_save :save_version
  klass.after_save :after_save_version
  klass.send(:include, Mongoid::Delorean::Trackable::CommonInstanceMethods)
end

Instance Method Details

#after_save_versionObject



46
47
48
# File 'lib/mongoid/delorean/trackable.rb', line 46

def after_save_version
  @__track_changes = Mongoid::Delorean.config.track_history
end

#revert!(version = (self.version - 1)) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/mongoid/delorean/trackable.rb', line 61

def revert!(version = (self.version - 1))
  old_version = self.versions.where(version: version).first
  if old_version
    old_version.full_attributes.each do |key, value|
      self.write_attribute(key, value)
    end
    self.save!
  end
end

#save_versionObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/mongoid/delorean/trackable.rb', line 17

def save_version
  if self.track_history?
    last_version = self.versions.last
    _version = last_version ? last_version.version + 1 : 1

    _attributes = self.attributes_with_relations
    _attributes.merge!("version" => _version)
    _changes = self.changes_with_relations.dup
    _changes.merge!("version" => [self.version_was, _version])

    Mongoid::Delorean::History.create(original_class: self.class.name, original_class_id: self.id, version: _version, altered_attributes: _changes, full_attributes: _attributes)
    self.without_history_tracking do
      self.version = _version
      # self.save!
      unless(self.new_record?)
        if ::Mongoid.const_defined? :Observer
          self.set(:version, _version)
        else
          self.set(version: _version)
        end
      end
    end

    @__track_changes = false
  end

  true
end

#track_history?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/mongoid/delorean/trackable.rb', line 50

def track_history?
  @__track_changes.nil? ? Mongoid::Delorean.config.track_history : @__track_changes
end

#versionsObject



13
14
15
# File 'lib/mongoid/delorean/trackable.rb', line 13

def versions
  Mongoid::Delorean::History.where(original_class: self.class.name, original_class_id: self.id)
end

#without_history_trackingObject



54
55
56
57
58
59
# File 'lib/mongoid/delorean/trackable.rb', line 54

def without_history_tracking
  previous_track_change = @__track_changes
  @__track_changes = false
  yield
  @__track_changes = previous_track_change
end