Audit saves the changes to ActiveRecord models. It has the following attributes:
auditable
: the ActiveRecord model that was changed
user
: the user that performed the change; a string or an
ActiveRecord model
action
: one of create, update, or delete
audited_changes
: a serialized hash of all the changes
comment
: a comment set with the audit
created_at
: Time that the change was performed
All audits made during the block called will be recorded as made by
user
. This method is hopefully threadsafe, making it ideal for
background operations that require audit information.
# File lib/acts_as_audited/audit.rb, line 38 def as_user(user, &block) Thread.current[:acts_as_audited_user] = user yieldval = yield Thread.current[:acts_as_audited_user] = nil yieldval end
@private
# File lib/acts_as_audited/audit.rb, line 59 def assign_revision_attributes(record, attributes) attributes.each do |attr, val| record = record.dup if record.frozen? if record.respond_to?("#{attr}=") record.attributes.has_key?(attr.to_s) ? record[attr] = val : record.send("#{attr}=", val) end end record end
Returns the list of classes that are being audited
# File lib/acts_as_audited/audit.rb, line 31 def audited_classes audited_class_names.map(&:constantize) end
@private
# File lib/acts_as_audited/audit.rb, line 49 def reconstruct_attributes(audits) attributes = {} result = audits.collect do |audit| attributes.merge!(audit.new_attributes).merge!(:version => audit.version) yield attributes if block_given? end block_given? ? result : attributes end
Return all audits older than the current one.
# File lib/acts_as_audited/audit.rb, line 103 def ancestors self.class.where(['auditable_id = ? and auditable_type = ? and version <= ?', auditable_id, auditable_type, version]) end
Returns a hash of the changed attributes with the new values
# File lib/acts_as_audited/audit.rb, line 109 def new_attributes (audited_changes || {}).inject({}.with_indifferent_access) do |attrs,(attr,values)| attrs[attr] = values.is_a?(Array) ? values.last : values attrs end end
Returns a hash of the changed attributes with the old values
# File lib/acts_as_audited/audit.rb, line 117 def old_attributes (audited_changes || {}).inject({}.with_indifferent_access) do |attrs,(attr,values)| attrs[attr] = Array(values).first attrs end end
Return an instance of what the object looked like at this revision. If the object has been destroyed, this will be a new record.
# File lib/acts_as_audited/audit.rb, line 95 def revision clazz = auditable_type.constantize ( clazz.find_by_id(auditable_id) || clazz.new ).tap do |m| Audit.assign_revision_attributes(m, self.class.reconstruct_attributes(ancestors).merge({:version => version})) end end
@private
# File lib/acts_as_audited/audit.rb, line 87 def user_as_string self.user_as_model || self.username end
Allows user to be set to either a string or an ActiveRecord object @private
# File lib/acts_as_audited/audit.rb, line 76 def user_as_string=(user) # reset both either way self.user_as_model = self.username = nil user.is_a?(ActiveRecord::Base) ? self.user_as_model = user : self.username = user end