Class: Audit
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Audit
- Defined in:
- lib/acts_as_audited/audit.rb
Overview
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 -
changes
: a serialized hash of all the changes -
created_at
: Time that the change was performed
Class Method Summary collapse
-
.as_user(user, &block) ⇒ Object
All audits made during the block called will be recorded as made by
user
. - .assign_revision_attributes(record, attributes) ⇒ Object
- .audited_classes ⇒ Object
- .reconstruct_attributes(audits) ⇒ Object
Instance Method Summary collapse
- #ancestors ⇒ Object
-
#new_attributes ⇒ Object
Returns a hash of the changed attributes with the new values.
-
#old_attributes ⇒ Object
Returns a hash of the changed attributes with the old values.
- #revision ⇒ Object
-
#user_as_string ⇒ Object
(also: #user)
:nodoc:.
-
#user_as_string=(user) ⇒ Object
(also: #user=)
Allows user to be set to either a string or an ActiveRecord object.
Class Method Details
.as_user(user, &block) ⇒ Object
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.
29 30 31 32 33 34 35 |
# File 'lib/acts_as_audited/audit.rb', line 29 def self.as_user(user, &block) Thread.current[:acts_as_audited_user] = user yield Thread.current[:acts_as_audited_user] = nil end |
.assign_revision_attributes(record, attributes) ⇒ Object
92 93 94 95 96 97 98 99 100 101 |
# File 'lib/acts_as_audited/audit.rb', line 92 def self.assign_revision_attributes(record, attributes) attributes.each do |attr, val| if record.respond_to?("#{attr}=") record.attributes.has_key?(attr.to_s) ? record[attr] = val : record.send("#{attr}=", val) end end record end |
.audited_classes ⇒ Object
22 23 24 |
# File 'lib/acts_as_audited/audit.rb', line 22 def self.audited_classes self.audited_class_names.map(&:constantize) end |
.reconstruct_attributes(audits) ⇒ Object
83 84 85 86 87 88 89 90 |
# File 'lib/acts_as_audited/audit.rb', line 83 def self.reconstruct_attributes(audits) attributes = {} result = audits.collect do |audit| attributes.merge!(audit.new_attributes).merge!(:audit_version => audit.audit_version) yield attributes if block_given? end block_given? ? result : attributes end |
Instance Method Details
#ancestors ⇒ Object
61 62 63 64 65 |
# File 'lib/acts_as_audited/audit.rb', line 61 def ancestors self.class.find(:all, :order => 'audit_version', :conditions => ['auditable_id = ? and auditable_type = ? and audit_version <= ?', auditable_id, auditable_type, audit_version]) end |
#new_attributes ⇒ Object
Returns a hash of the changed attributes with the new values
68 69 70 71 72 73 |
# File 'lib/acts_as_audited/audit.rb', line 68 def new_attributes (changes || {}).inject({}.with_indifferent_access) do |attrs,(attr,values)| attrs[attr] = values.is_a?(Array) ? values.last : values attrs end end |
#old_attributes ⇒ Object
Returns a hash of the changed attributes with the old values
76 77 78 79 80 81 |
# File 'lib/acts_as_audited/audit.rb', line 76 def old_attributes (changes || {}).inject({}.with_indifferent_access) do |attrs,(attr,values)| attrs[attr] = Array(values).first attrs end end |
#revision ⇒ Object
54 55 56 57 58 59 |
# File 'lib/acts_as_audited/audit.rb', line 54 def revision clazz = auditable_type.constantize returning clazz.find_by_id(auditable_id) || clazz.new do |m| Audit.assign_revision_attributes(m, self.class.reconstruct_attributes(ancestors).merge({:audit_version => audit_version})) end end |
#user_as_string ⇒ Object Also known as: user
:nodoc:
48 49 50 |
# File 'lib/acts_as_audited/audit.rb', line 48 def user_as_string #:nodoc: self.user_as_model || self.username end |
#user_as_string=(user) ⇒ Object Also known as: user=
Allows user to be set to either a string or an ActiveRecord object
38 39 40 41 42 43 44 |
# File 'lib/acts_as_audited/audit.rb', line 38 def user_as_string=(user) #:nodoc: # 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 |