module ActiveAdmin::Audit::HasVersions::ClassMethods

Public Instance Methods

has_versions(options = {}) click to toggle source
# File lib/active_admin/audit/has_versions.rb, line 9
def has_versions(options = {})
  options[:also_include] ||= {}
  options[:skip] ||= []
  options[:skip] += options[:also_include].keys
  if respond_to?(:translated_attrs)
    options[:skip] += translated_attrs.map { |attr| "#{attr}_translations" }
  end

  has_paper_trail options.merge(on: [], class_name: 'ActiveAdmin::Audit::ContentVersion', meta: {
    additional_objects: ->(record) { record.additional_objects_snapshot.to_json },
    additional_objects_changes: ->(record) { record.additional_objects_snapshot_changes.to_json },
  })

  class_eval do
    define_method(:additional_objects_snapshot) do
      options[:also_include].each_with_object(VersionSnapshot.new) do |(attr, scheme), snapshot|
        snapshot[attr] =
          if scheme.is_a? Symbol
            send(scheme)
          elsif scheme.empty?
            send(attr)
          else
            Array(send(attr)).map do |item|
              scheme.each_with_object({}) do |item_attr, item_snapshot|
                item_snapshot[item_attr] = item.send(item_attr)
              end
            end
          end
      end
    end

    # Will save new version of the object
    after_commit do
      if paper_trail.enabled?
        if @event_for_paper_trail
          generate_version!
        end
      end
    end

    options_on = Array(options.fetch(:on, [:create, :update, :destroy]))

    if options_on.include?(:create)
      after_create do
        if paper_trail.enabled?
          @event_for_paper_trail = 'create'
        end
      end
    end

    if options_on.include?(:update)
      # Cache object changes to access it from after_commit
      after_update do
        if paper_trail.enabled?
          @event_for_paper_trail = 'update'
          cache_version_object_changes
        end
      end
    end

    if options_on.include?(:destroy)
      # Cache all details to access it from after_commit
      before_destroy do
        if paper_trail.enabled?
          @event_for_paper_trail = 'destroy'
          cache_version_object
          cache_version_object_changes
          cache_version_additional_objects_and_changes
        end
      end
    end
  end
end