track_history 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
data/lib/track_history.rb
CHANGED
@@ -53,7 +53,7 @@ module TrackHistory
|
|
53
53
|
end
|
54
54
|
|
55
55
|
# get the history class in line
|
56
|
-
@klass_reference.send(:extend, HistoryMethods)
|
56
|
+
@klass_reference.send(:extend, TrackHistory::HistoryMethods)
|
57
57
|
|
58
58
|
# figure out the field for tracking action (enum)
|
59
59
|
@klass_reference.instance_variable_set(:@historical_action_field, @klass_reference.columns_hash.has_key?('action') ? 'action' : nil)
|
@@ -73,23 +73,23 @@ module TrackHistory
|
|
73
73
|
|
74
74
|
# create the history class
|
75
75
|
rel = base.name.singularize.underscore.downcase.to_sym
|
76
|
-
@klass_reference.send(:include, HistoricalRelationHelpers)
|
76
|
+
@klass_reference.send(:include, TrackHistory::HistoricalRelationHelpers)
|
77
77
|
|
78
78
|
# create a backward reference
|
79
79
|
if track_reference
|
80
80
|
@klass_reference.belongs_to rel
|
81
81
|
@klass_reference.send(:alias_method, :historical_relation, rel)
|
82
|
-
has_many :histories, :class_name => model_name, :order => '
|
82
|
+
has_many :histories, :class_name => model_name, :order => 'id desc' if track_reference
|
83
83
|
end
|
84
84
|
|
85
85
|
# tell the other class about us
|
86
86
|
# purposely don't define these until after getting historical_fields
|
87
|
-
before_update
|
87
|
+
before_update :record_historical_changes
|
88
88
|
|
89
89
|
# track other things (optionally)
|
90
90
|
unless @klass_reference.historical_action_field.nil?
|
91
|
-
after_create
|
92
|
-
before_destroy
|
91
|
+
after_create :record_historical_changes_on_create
|
92
|
+
before_destroy :record_historical_changes_on_destroy
|
93
93
|
end
|
94
94
|
|
95
95
|
end
|
@@ -100,7 +100,15 @@ module TrackHistory
|
|
100
100
|
|
101
101
|
private
|
102
102
|
|
103
|
-
def
|
103
|
+
def record_historical_changes_on_destroy
|
104
|
+
record_historical_changes('destroy')
|
105
|
+
end
|
106
|
+
|
107
|
+
def record_historical_changes_on_create
|
108
|
+
record_historical_changes('create')
|
109
|
+
end
|
110
|
+
|
111
|
+
def record_historical_changes(action = 'update')
|
104
112
|
historical_fields = self.class.historical_class.historical_fields
|
105
113
|
historical_tracks = self.class.historical_class.historical_tracks
|
106
114
|
return if historical_fields.empty? && historical_tracks.empty?
|
@@ -1,17 +1,21 @@
|
|
1
|
-
module
|
1
|
+
module TrackHistory
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
module HistoricalRelationHelpers
|
4
|
+
|
5
|
+
# Get a list of the modifications in a given history
|
6
|
+
def modifications
|
7
|
+
self.class.historical_fields.reject do |field, options|
|
8
|
+
send(options[:before]) == send(options[:after])
|
9
|
+
end.keys
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
return 'modified nothing' if modifications.empty?
|
14
|
+
str = 'modified ' + modifications.sort.join(', ')
|
15
|
+
str += " on #{historical_relation}" if self.class.instance_variable_get(:@track_historical_reference)
|
16
|
+
str
|
17
|
+
end
|
9
18
|
|
10
|
-
def to_s
|
11
|
-
return 'modified nothing' if modifications.empty?
|
12
|
-
str = 'modified ' + modifications.sort.join(', ')
|
13
|
-
str += " on #{historical_relation}" if self.class.instance_variable_get(:@track_historical_reference)
|
14
|
-
str
|
15
19
|
end
|
16
20
|
|
17
21
|
end
|
@@ -1,38 +1,42 @@
|
|
1
|
-
module
|
1
|
+
module TrackHistory
|
2
2
|
|
3
|
-
|
3
|
+
module HistoryMethods
|
4
4
|
|
5
|
-
|
6
|
-
@track_historical_reference
|
7
|
-
end
|
5
|
+
attr_reader :historical_fields, :historical_action_field
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
def track_historical_reference?
|
8
|
+
@track_historical_reference
|
9
|
+
end
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
def historical_fields
|
12
|
+
@historical_fields ||= {}
|
13
|
+
end
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
:
|
23
|
-
|
24
|
-
|
25
|
-
|
15
|
+
def historical_tracks
|
16
|
+
@historical_tracks ||= {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def field(field, options = {})
|
20
|
+
options.assert_valid_keys(:before, :after)
|
21
|
+
field_s = field.is_a?(String) ? field : field.to_s
|
22
|
+
historical_fields[field_s] = {
|
23
|
+
:before => options[:before] || nil,
|
24
|
+
:after => options[:after] || nil
|
25
|
+
}
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def annotate(field, options = {}, &block) # haha
|
30
|
+
options.assert_valid_keys(:as)
|
31
|
+
save_as = options.has_key?(:as) ? options[:as] : field
|
26
32
|
|
27
|
-
|
28
|
-
|
29
|
-
|
33
|
+
unless columns_hash.has_key?(save_as.to_s)
|
34
|
+
raise ActiveRecord::StatementInvalid.new("No such attribute '#{save_as}' on #{self.name}")
|
35
|
+
end
|
30
36
|
|
31
|
-
|
32
|
-
raise ActiveRecord::StatementInvalid.new("No such attribute '#{save_as}' on #{self.name}")
|
37
|
+
historical_tracks[save_as] = block.nil? ? field : block
|
33
38
|
end
|
34
39
|
|
35
|
-
historical_tracks[save_as] = block.nil? ? field : block
|
36
40
|
end
|
37
41
|
|
38
42
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: track_history
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 11
|
10
|
+
version: 0.0.11
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Crepezzi
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-16 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|