Module: SnailTrail::VersionConcern

Extended by:
ActiveSupport::Concern
Included in:
Version
Defined in:
lib/snail_trail/version_concern.rb

Overview

Originally, SnailTrail did not provide this module, and all of this functionality was in SnailTrail::Version. That model still exists (and is used by most apps) but by moving the functionality to this module, people can include this concern instead of sub-classing the Version model.

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

E_YAML_PERMITTED_CLASSES =
"  SnailTrail encountered a Psych::DisallowedClass error during\n  deserialization of YAML column, indicating that\n  yaml_column_permitted_classes has not been configured correctly. %s\n".squish.freeze

Instance Method Summary collapse

Instance Method Details

#changesetObject

Returns what changed in this version of the item. ActiveModel::Dirty#changes. returns nil if your versions table does not have an object_changes text column.



279
280
281
282
# File 'lib/snail_trail/version_concern.rb', line 279

def changeset
  return nil unless self.class.column_names.include? "object_changes"
  @changeset ||= load_changeset
end

#indexObject

Returns an integer representing the chronological position of the version among its siblings. The "create" event, for example, has an index of 0.



309
310
311
# File 'lib/snail_trail/version_concern.rb', line 309

def index
  @index ||= RecordHistory.new(sibling_versions, self.class).index(self)
end

#nextObject



296
297
298
# File 'lib/snail_trail/version_concern.rb', line 296

def next
  @next ||= sibling_versions.subsequent(self).first
end

#object_deserializedObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



243
244
245
246
247
248
249
# File 'lib/snail_trail/version_concern.rb', line 243

def object_deserialized
  if self.class.object_col_is_json?
    object
  else
    SnailTrail.serializer.load(object)
  end
end

#previousObject



300
301
302
# File 'lib/snail_trail/version_concern.rb', line 300

def previous
  @previous ||= sibling_versions.preceding(self).first
end

#reify(options = {}) ⇒ Object

Restore the item from this version.

Options:

  • :mark_for_destruction
    • true - Mark the has_one/has_many associations that did not exist in the reified version for destruction, instead of removing them.
    • false - Default. Useful for persisting the reified version.
  • :dup
    • false - Default.
    • true - Always create a new object instance. Useful for comparing two versions of the same object.
  • :unversioned_attributes
    • :nil - Default. Attributes undefined in version record are set to nil in reified record.
    • :preserve - Attributes undefined in version record are not modified.


268
269
270
271
272
273
274
# File 'lib/snail_trail/version_concern.rb', line 268

def reify(options = {})
  unless self.class.column_names.include? "object"
    raise Error, "reify requires an object column"
  end
  return nil if object.nil?
  ::SnailTrail::Reifier.reify(self, options)
end

#snail_trail_originatorObject

Returns who put the item into the state stored in this version.



285
286
287
# File 'lib/snail_trail/version_concern.rb', line 285

def snail_trail_originator
  @snail_trail_originator ||= previous.try(:whodunnit)
end

#terminatorObject Also known as: version_author

Returns who changed the item from the state it had in this version. This is an alias for whodunnit.



291
292
293
# File 'lib/snail_trail/version_concern.rb', line 291

def terminator
  @terminator ||= whodunnit
end