Sha256: 8b6e6c8f20f86469c196aaf801e2539c633c7f32f917f1e4a975e62dfabf037e

Contents?: true

Size: 1.92 KB

Versions: 1

Compression:

Stored size: 1.92 KB

Contents

module PaperTrail

  def self.included(base)
    base.send :extend, ClassMethods
  end


  module ClassMethods
    # Options:
    # :ignore    an array of attributes for which a new +Version+ will not be created if only they change.
    def has_paper_trail(options = {})
      send :include, InstanceMethods

      cattr_accessor :ignore
      self.ignore = (options[:ignore] || []).map &:to_s
      
      cattr_accessor :paper_trail_active
      self.paper_trail_active = true

      has_many :versions, :as => :item, :order => 'created_at ASC, id ASC'

      after_create  :record_create
      before_update :record_update
      after_destroy :record_destroy
    end

    def paper_trail_off
      self.paper_trail_active = false
    end

    def paper_trail_on
      self.paper_trail_active = true
    end
  end


  module InstanceMethods
    def record_create
      versions.create(:event     => 'create',
                      :whodunnit => PaperTrail.whodunnit) if self.class.paper_trail_active
    end

    def record_update
      if changed_and_we_care? and self.class.paper_trail_active
        versions.build :event     => 'update',
                       :object    => object_to_string(previous_version),
                       :whodunnit => PaperTrail.whodunnit
      end
    end

    def record_destroy
      versions.create(:event     => 'destroy',
                      :object    => object_to_string(previous_version),
                      :whodunnit => PaperTrail.whodunnit) if self.class.paper_trail_active
    end

    private

    def previous_version
      previous = self.clone
      previous.id = id
      changes.each do |attr, ary|
        previous.send "#{attr}=", ary.first
      end
      previous
    end

    def object_to_string(object)
      object.attributes.to_yaml
    end

    def changed_and_we_care?
      changed? and !(changed - self.class.ignore).empty?
    end
  end

end

ActiveRecord::Base.send :include, PaperTrail

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
paper_trail-1.3.1 lib/paper_trail/has_paper_trail.rb