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
- .manual_audit(user, action, on_behalf_of = nil, auditable = nil) ⇒ 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
:nodoc:.
-
#user_as_string=(user) ⇒ Object
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 |
# File 'lib/acts_as_audited/audit.rb', line 29 def 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
108 109 110 111 112 113 114 115 116 117 |
# File 'lib/acts_as_audited/audit.rb', line 108 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 audited_classes self.audited_class_names.map(&:constantize) end |
.manual_audit(user, action, on_behalf_of = nil, auditable = nil) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/acts_as_audited/audit.rb', line 35 def manual_audit(user, action, on_behalf_of = nil, auditable = nil) attribs = { :action => action } case user when ActiveRecord::Base attribs[CollectiveIdea::Acts::Audited.human_model] = user when String attribs[:username] = user end case auditable when ActiveRecord::Base attribs[:auditable] = auditable when String attribs[:auditable_type] = auditable end attribs[:on_behalf_of] = on_behalf_of if on_behalf_of Audit.create attribs end |
.reconstruct_attributes(audits) ⇒ Object
99 100 101 102 103 104 105 106 |
# File 'lib/acts_as_audited/audit.rb', line 99 def self.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 |
Instance Method Details
#ancestors ⇒ Object
77 78 79 80 81 |
# File 'lib/acts_as_audited/audit.rb', line 77 def ancestors self.class.find(:all, :order => 'version', :conditions => ['auditable_id = ? and auditable_type = ? and version <= ?', auditable_id, auditable_type, version]) end |
#new_attributes ⇒ Object
Returns a hash of the changed attributes with the new values
84 85 86 87 88 89 |
# File 'lib/acts_as_audited/audit.rb', line 84 def new_attributes (changes || {}).inject({}.with_indifferent_access) do |attrs,(attr,values)| attrs[attr] = Array(values).last attrs end end |
#old_attributes ⇒ Object
Returns a hash of the changed attributes with the old values
92 93 94 95 96 97 |
# File 'lib/acts_as_audited/audit.rb', line 92 def old_attributes (changes || {}).inject({}.with_indifferent_access) do |attrs,(attr,values)| attrs[attr] = Array(values).first attrs end end |
#revision ⇒ Object
70 71 72 73 74 75 |
# File 'lib/acts_as_audited/audit.rb', line 70 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({:version => version})) end end |
#user_as_string ⇒ Object
:nodoc:
66 67 68 |
# File 'lib/acts_as_audited/audit.rb', line 66 def user_as_string #:nodoc: self.user_as_model || self.username end |
#user_as_string=(user) ⇒ Object
Allows user to be set to either a string or an ActiveRecord object
58 59 60 61 62 63 64 |
# File 'lib/acts_as_audited/audit.rb', line 58 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 |