counter_culture 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/counter_culture.gemspec +2 -2
- data/lib/counter_culture.rb +16 -3
- metadata +3 -3
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.4
|
data/counter_culture.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = "counter_culture"
|
|
8
|
-
s.version = "0.1.
|
|
8
|
+
s.version = "0.1.4"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Magnus von Koeller"]
|
|
12
|
-
s.date = "2012-05-
|
|
12
|
+
s.date = "2012-05-31"
|
|
13
13
|
s.description = "counter_culture provides turbo-charged counter caches that are kept up-to-date not just on create and destroy, that support multiple levels of indirection through relationships, allow dynamic column names and that avoid deadlocks by updating in the after_commit callback."
|
|
14
14
|
s.email = "magnus@vonkoeller.de"
|
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/counter_culture.rb
CHANGED
|
@@ -38,6 +38,9 @@ module CounterCulture
|
|
|
38
38
|
# on original data; if the counter cache is incorrect, sets it to the correct
|
|
39
39
|
# count
|
|
40
40
|
#
|
|
41
|
+
# options:
|
|
42
|
+
# { :exclude => list of relations to skip when fixing counts,
|
|
43
|
+
# :only => only these relations will have their counts fixed }
|
|
41
44
|
# returns: a list of fixed record as an array of hashes of the form:
|
|
42
45
|
# { :entity => which model the count was fixed on,
|
|
43
46
|
# :id => the id of the model that had the incorrect count,
|
|
@@ -45,9 +48,17 @@ module CounterCulture
|
|
|
45
48
|
# :wrong => the previously saved, incorrect count,
|
|
46
49
|
# :right => the newly fixed, correct count }
|
|
47
50
|
#
|
|
48
|
-
def counter_culture_fix_counts
|
|
51
|
+
def counter_culture_fix_counts(options = {})
|
|
52
|
+
options[:exclude] = [options[:exclude]] if options[:exclude] && !options[:exclude].is_a?(Enumerable)
|
|
53
|
+
options[:exclude] = options[:exclude].try(:map) {|x| x.is_a?(Enumerable) ? x : [x] }
|
|
54
|
+
options[:only] = [options[:only]] if options[:only] && !options[:only].is_a?(Enumerable)
|
|
55
|
+
options[:only] = options[:only].try(:map) {|x| x.is_a?(Enumerable) ? x : [x] }
|
|
56
|
+
|
|
49
57
|
fixed = []
|
|
50
|
-
@after_commit_counter_cache.
|
|
58
|
+
@after_commit_counter_cache.each do |hash|
|
|
59
|
+
next if options[:exclude] && options[:exclude].include?(hash[:relation])
|
|
60
|
+
next if options[:only] && !options[:only].include?(hash[:relation])
|
|
61
|
+
|
|
51
62
|
# which class does this relation ultimately point to? that's where we have to start
|
|
52
63
|
klass = relation_klass(hash[:relation])
|
|
53
64
|
|
|
@@ -55,6 +66,8 @@ module CounterCulture
|
|
|
55
66
|
query = klass.select("#{klass.table_name}.id, COUNT(#{self.table_name}.id) AS count")
|
|
56
67
|
query = query.group("#{klass.table_name}.id")
|
|
57
68
|
|
|
69
|
+
raise "Fixing counter caches is not supported when using :foreign_key_values" if hash[:foreign_key_values]
|
|
70
|
+
|
|
58
71
|
# if we're provided a custom set of column names with conditions, use them; just use the
|
|
59
72
|
# column name otherwise
|
|
60
73
|
raise "Must provide :column_names option for relation #{hash[:relation].inspect} when :counter_cache_name is a Proc" if hash[:counter_cache_name].is_a?(Proc) && !hash[:column_names]
|
|
@@ -83,7 +96,7 @@ module CounterCulture
|
|
|
83
96
|
# now that we know what the correct counts are, we need to iterate over all instances
|
|
84
97
|
# and check whether the count is correct; if not, we correct it
|
|
85
98
|
klass.find_each do |model|
|
|
86
|
-
if model.
|
|
99
|
+
if model.read_attribute(column_name) != counts[model.id].to_i
|
|
87
100
|
# keep track of what we fixed, e.g. for a notification email
|
|
88
101
|
fixed<< {
|
|
89
102
|
:entity => klass.name,
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: counter_culture
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2012-05-
|
|
12
|
+
date: 2012-05-31 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rails
|
|
@@ -216,7 +216,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
216
216
|
version: '0'
|
|
217
217
|
segments:
|
|
218
218
|
- 0
|
|
219
|
-
hash: -
|
|
219
|
+
hash: -1949241983326778340
|
|
220
220
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
221
|
none: false
|
|
222
222
|
requirements:
|