Module: ActiveVersion::Audits::AuditRecord

Extended by:
ActiveSupport::Concern
Includes:
Callbacks, SQLBuilder
Defined in:
lib/active_version/audits/audit_record.rb,
lib/active_version/audits/audit_record/callbacks.rb,
lib/active_version/audits/audit_record/serializers.rb

Overview

Marker module for audit models Identifies a model as an audit record

Defined Under Namespace

Modules: Callbacks, ClassMethods, Serializers Classes: AuditSchemaDSL

Instance Method Summary collapse

Instance Method Details

#ancestorsObject

Get ancestors (all audits before this one)



473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
# File 'lib/active_version/audits/audit_record.rb', line 473

def ancestors
  auditable_column = ActiveVersion.column_mapper.column_for(self.class.source_class, :audits, :auditable)
  type_column = auditable_column.to_s.end_with?("_type") ? auditable_column.to_s : "#{auditable_column}_type"
  identity_columns = self.class.source_identity_columns
  auditable_identity_map = identity_columns.index_with { |column| self[column] }
  auditable_type_value = self[type_column]
  version_column = ActiveVersion.column_mapper.column_for(self.class.source_class, :audits, :version)
  version_value = self[version_column]
  self.class
    .ascending
    .auditable_finder(auditable_identity_map, auditable_type_value, identity_columns)
    .to_version(version_value)
rescue ::NameError, ::NoMethodError
  self.class.none
end

#new_attributesObject

Get new attributes from this audit



437
438
439
440
441
442
443
444
445
446
447
# File 'lib/active_version/audits/audit_record.rb', line 437

def new_attributes
  changes_column = self.class.audit_column_for(:changes)
  changes = send(changes_column) || {}
  if changes.is_a?(Hash) && changes.any?
    changes.each_with_object({}) do |(attr, values), attrs|
      attrs[attr] = (action_value == "update") ? values.last : values
    end
  else
    structured_audited_attributes
  end
end

#old_attributesObject

Get old attributes from this audit



462
463
464
465
466
467
468
469
470
# File 'lib/active_version/audits/audit_record.rb', line 462

def old_attributes
  changes_column = self.class.audit_column_for(:changes)
  changes = send(changes_column) || {}
  return {} unless changes.is_a?(Hash) && changes.any?

  changes.each_with_object({}) do |(attr, values), attrs|
    attrs[attr] = (action_value == "update") ? values.first : nil
  end
end

#revisionObject

Reconstruct object at this revision



490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
# File 'lib/active_version/audits/audit_record.rb', line 490

def revision
  auditable_column = ActiveVersion.column_mapper.column_for(self.class.source_class, :audits, :auditable)
  auditable_record = send(auditable_column) if respond_to?(auditable_column)
  return nil unless auditable_record

  audits = ancestors
  attributes = self.class.reconstruct_attributes(audits)
  auditable_record.dup.tap do |revision|
    revision.assign_attributes(attributes)
    revision.instance_variable_set(:@new_record, destroyed?)
    revision.instance_variable_set(:@persisted, !destroyed?)
  end
rescue ::NameError, ::NoMethodError
  nil
end

#structured_audited_attributesObject



449
450
451
452
453
454
455
456
457
458
459
# File 'lib/active_version/audits/audit_record.rb', line 449

def structured_audited_attributes
  source_columns = self.class.source_class.column_names
  ignored = ActiveVersion.config.ignored_attributes.map(&:to_s)

  source_columns.each_with_object({}) do |attr, attrs|
    next if ignored.include?(attr)
    next unless self.class.column_names.include?(attr)

    attrs[attr] = self[attr]
  end
end