class ActiveRecord::Base
before_save :before_save @@auditable_properties = {} @@parent_models = {} @@current_user_id = nil def self.auditable_properties return @@auditable_properties[self.to_s] if !@@auditable_properties.blank? return nil end def self.parent_model return @@parent_models[self.to_s] if !@@parent_models.blank? return nil end def self.audits(*properties) @@auditable_properties[self.to_s] = properties # puts "Calling audits from class #{self.to_s}" end def self.audit_parent(parent_model) @@parent_models[self.to_s] = parent_model end def log_changes(parent_model_class_name = nil, parent_model_id = nil) auditable_properties_list = self.class.auditable_properties return if self.id.blank? or auditable_properties_list.blank? auditable_properties_list.each do |property| # Create Change object original_value = self.send "#{property.to_s}_was" new_value = self.send property.to_s next if original_value.eql? new_value c = Change.new c.model_class_name = self.class.name.demodulize c.model_id = self.id c.property_name = property.to_s c.parent_model_class_name = parent_model_class_name c.parent_model_id = parent_model_id c.original_value = original_value.to_s if !original_value.blank? c.new_value = new_value.to_s if !new_value.blank? c.created_at = DateTime.now c.created_by_id = Thread.current[:user].id if !Thread.current[:user].blank? c.save! end end def before_save return if self.class.auditable_properties.blank? parent = self.class.parent_model.blank? ? nil : self.send(self.class.parent_model.to_s) parent_model_id = parent.blank? ? nil : parent.id parent_model_class_name = parent.blank? ? nil : parent.class.name.demodulize self.log_changes(parent_model_class_name, parent_model_id) end def get_changes return nil if self.class.auditable_properties.blank? or self.id.blank? return Change.get_model_changes(self.class.name.demodulize, self.id) end
end
class ActionController::Base
before_filter :set_audit_user def set_audit_user Thread.current[:user] = current_<%= @user_class %> if defined? current_<%= @user_class %> and !current_<%= @user_class %>.blank? end
end