Module: PaperTrail::VersionConcern

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

Overview

Originally, PaperTrail did not provide this module, and all of this functionality was in ‘PaperTrail::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

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.



244
245
246
247
# File 'lib/paper_trail/version_concern.rb', line 244

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 (see ‘sibling_versions`). The “create” event, for example, has an index of 0.



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

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

#nextObject



268
269
270
# File 'lib/paper_trail/version_concern.rb', line 268

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.



198
199
200
201
202
203
204
# File 'lib/paper_trail/version_concern.rb', line 198

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

#paper_trail_originatorObject

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



250
251
252
# File 'lib/paper_trail/version_concern.rb', line 250

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

#previousObject



272
273
274
# File 'lib/paper_trail/version_concern.rb', line 272

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

#reify(options = {}) ⇒ Object

Restore the item from this version.

Optionally this can also restore all :has_one and :has_many (including has_many :through) associations as they were “at the time”, if they are also being versioned by PaperTrail.

Options:

  • :has_one

    • ‘true` - Also reify has_one associations.

    • ‘false - Default.

  • :has_many

    • ‘true` - Also reify has_many and has_many :through associations.

    • ‘false` - Default.

  • :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.



233
234
235
236
237
238
239
# File 'lib/paper_trail/version_concern.rb', line 233

def reify(options = {})
  unless self.class.column_names.include? "object"
    raise "reify can't be called without an object column"
  end
  return nil if object.nil?
  ::PaperTrail::Reifier.reify(self, options)
end

#sibling_versions(reload = false) ⇒ Object



261
262
263
264
265
266
# File 'lib/paper_trail/version_concern.rb', line 261

def sibling_versions(reload = false)
  if reload || !defined?(@sibling_versions) || @sibling_versions.nil?
    @sibling_versions = self.class.with_item_keys(item_type, item_id)
  end
  @sibling_versions
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`.



256
257
258
# File 'lib/paper_trail/version_concern.rb', line 256

def terminator
  @terminator ||= whodunnit
end