10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# File 'lib/has_audit_trail/audit_trail_include.rb', line 10
def has_audit_trail(opts = {})
return if self.included_modules.include?(HasAuditTrail::AuditTrailInclude::InstanceMethods)
opts.assert_valid_keys HasAuditTrail::AuditTrailInclude::VALID_OPTIONS
class_attribute :audited_columns, :instance_writer => false
class_attribute :audited_associations, :instance_writer => false
class_attribute :audited_collections, :instance_writer => false
class_attribute :changed_collections, :instance_writer => false
self.audited_columns = opts[:only] || self.column_names.collect { |str| str.to_sym }
self.audited_columns -= opts[:except] if opts[:except]
self.audited_columns -= [:id, :created_at, :updated_at]
self.audited_associations = opts[:audit_nested] if opts[:audit_nested]
self.audited_collections = []
self.audited_columns.each do |attr|
if self.respond_to? "after_add_for_#{attr}"
self.audited_collections << attr
self.audited_columns -= [attr]
end
end
self.changed_collections = {}
self.audited_collections.try(:each) do |attr|
self.changed_collections[attr] = { :added => [], :removed => [] }
self.send("after_add_for_#{attr}") << Proc.new { |owner, record| owner.changed_collections[attr.to_sym][:added] << record }
self.send("after_remove_for_#{attr}") << Proc.new { |owner, record| owner.changed_collections[attr.to_sym][:removed] << record }
end
after_create :_audit_create
before_update :_audit_update
before_destroy :_audit_destroy
include HasAuditTrail::AuditTrailInclude::InstanceMethods
end
|