module DirtyHistory::Mixin::ClassMethods

Public Instance Methods

creates_dirty_history() click to toggle source
# File lib/dirty_history/dirty_history_mixin.rb, line 63
def creates_dirty_history 
  # Mix in the module, but ensure to do so just once.
  metaclass = (class << self; self; end)
  return if metaclass.included_modules.include?(DirtyHistory::Mixin::CreatorInstanceMethods)

  has_many :dirty_history_records, :as => :creator
  
  include DirtyHistory::Mixin::CreatorInstanceMethods
end
has_dirty_history(*args) click to toggle source

pass an optional proc to assign a creator to the dirty_history object example usage: class User < ActiveRecord::Base

has_dirty_history :email, :first_name, :last_name, :creator => proc { User.current_user }

end

# File lib/dirty_history/dirty_history_mixin.rb, line 27
def has_dirty_history *args 
  # Mix in the module, but ensure to do so just once.
  metaclass = (class << self; self; end)
  return if metaclass.included_modules.include?(DirtyHistory::Mixin::ObjectInstanceMethods)

  has_many        :dirty_history_records, :as => :object, :dependent => :destroy
  attr_accessor   :dirty_history_changes, :initialize_dirty_history
  cattr_accessor  :dirty_history_columns  


  self.dirty_history_columns ||= []
    
  if args.present?
    
    before_save     :set_dirty_history_changes
    after_save      :save_dirty_history

    args.each do |arg| 
      if [String,Symbol].include?(arg.class)     
        arg = arg.to_sym
        self.dirty_history_columns << arg unless self.dirty_history_columns.include?(arg)
      elsif arg.is_a?(Hash)                      
        creator_proc = arg.delete(:creator)
        send :define_method, "creator_for_dirty_history" do 
          begin
            creator_proc.is_a?(Proc) ? creator_proc.call : nil
          rescue
            raise DirtyHistory::Mixin::CreatorProcError
          end
        end
      end
    end
    include DirtyHistory::Mixin::ObjectInstanceMethods
  end
end