Sha256: e366bcba326c6af67681670498b07d374fb0805edf12389f1cb7ee17f14f96da

Contents?: true

Size: 1.97 KB

Versions: 2

Compression:

Stored size: 1.97 KB

Contents

module LogChanges
  module Base
    extend ActiveSupport::Concern

    included do
      before_save  :build_changes_str, on: [:create, :update]
      after_commit :log_changes, on: [:create, :update]
    end

    # TODO: add created_by, created_at, updated_by, and updated_at
    def log_changes
      log_str = (@is_new_record ? 'New' : 'Updated') + " #{self.class.name} {id: #{id}} #{to_s}\n"
      log_str += @change_log_str if @change_log_str
      sr_log(
        self.class.name,
        "#{Time.zone.now.strftime('%-m/%-d/%Y at %-l:%M %p (%Z)')}\n#{log_str}",
        dir: Rails.root.join('log', 'record_changes').to_s
      )
    end

    def build_changes_str
      bt_assocs = self.class.reflect_on_all_associations(:belongs_to).map{|a| [a.options[:foreign_key].present? ? a.options[:foreign_key].to_s : "#{a.name}_id".to_s, {name: a.name, class: a.options[:polymorphic].present? ? nil : a.klass}]}.to_h

      @is_new_record = new_record?
      h = {}
      changes.each do |k, vals|
        bt_assoc = bt_assocs[k.to_s]
        if bt_assoc.present?
          h[bt_assoc[:name]] = []
          vals.each do |val|
            if bt_assoc[:class].nil?
              h[bt_assoc[:name]] << val
            else
              v = bt_assoc[:class].find_by_id( val )
              h[bt_assoc[:name]] << "{class: #{bt_assoc[:class].name}, id: #{val}} #{stringify_value(v)}"
            end
          end
        else
          h[k] = vals.map{|v| stringify_value(v)}
        end
      end
      @change_log_str = if new_record?
        h.map{|key_pair| "  #{key_pair[0]}: #{key_pair[1][1]}"}.join("\n")
      else
        h.map{|key_pair| "  #{key_pair[0]}:\n    FROM: #{key_pair[1][0]}\n    TO: #{key_pair[1][1]}"}.join("\n")
      end
    end

    def stringify_value val
      case
        when val.nil?
          'nil'
        when val.is_a?(Time) || val.is_a?(ActiveSupport::TimeWithZone)
          val.strftime('%-m/%-d/%Y at %-l:%M %p (%Z)')
        else
          val.to_s
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
log_changes-1.0.0 lib/log_changes/base.rb
log_changes-0.1.0 lib/log_changes/base.rb