module SimpleAuditTrail::Auditor::ClassMethods

Public Instance Methods

audit(fields, options = {}) click to toggle source
# File lib/simple_audit_trail.rb, line 8
def audit(fields, options = {})
  cattr_accessor :audited_fields
  self.audited_fields = fields.map(&:to_s)

  cattr_accessor :audit_options
  self.audit_options = { require_audited_user_id: true }.merge(options)

  attr_accessor :audited_user_id

  has_many :simple_audits,
           as: :simple_audit_trailable,
           class_name: 'SimpleAuditTrail::Audit',
           autosave: true

  after_create :save_all_audits
  define_method :save_all_audits do
    if audited_user_id.nil? && audit_options[:require_audited_user_id]
      raise 'audited setter method called without setting audited_user_id'
    end

    from = {}
    to = Hash[audited_fields.map { |k| [k, send(k)] }]
    unchanged = {}

    simple_audits.create(
      from: from.to_json,
      to: to.to_json,
      unchanged: unchanged.to_json,
      who_id: audited_user_id
    )
  end

  before_update :save_audits
  define_method :save_audits do
    changed_audited_fields = changes.slice(*audited_fields)

    if changed_audited_fields.present?
      if audited_user_id.nil? && audit_options[:require_audited_user_id]
        raise 'audited setter method called without setting audited_user_id'
      end

      from = Hash[changed_audited_fields.map { |k, v| [k, v[0]] }]
      to = Hash[changed_audited_fields.map { |k, v| [k, v[1]] }]
      unchanged = Hash[
        (audited_fields - changed_audited_fields.keys).map do |f|
          [f, send(f)]
        end
      ]

      simple_audits.create(
        from: from.to_json,
        to: to.to_json,
        unchanged: unchanged.to_json,
        who_id: audited_user_id
      )
    end
  end
end