incrdecr_cached_counts 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/README.rdoc +7 -5
  4. data/lib/cached_counts/version.rb +1 -1
  5. metadata +2 -51
  6. data/html/CachedCounts/ClassMethods.html +0 -960
  7. data/html/CachedCounts/Railtie.html +0 -102
  8. data/html/CachedCounts.html +0 -197
  9. data/html/README_rdoc.html +0 -152
  10. data/html/created.rid +0 -7
  11. data/html/css/fonts.css +0 -167
  12. data/html/css/rdoc.css +0 -590
  13. data/html/fonts/Lato-Light.ttf +0 -0
  14. data/html/fonts/Lato-LightItalic.ttf +0 -0
  15. data/html/fonts/Lato-Regular.ttf +0 -0
  16. data/html/fonts/Lato-RegularItalic.ttf +0 -0
  17. data/html/fonts/SourceCodePro-Bold.ttf +0 -0
  18. data/html/fonts/SourceCodePro-Regular.ttf +0 -0
  19. data/html/images/add.png +0 -0
  20. data/html/images/arrow_up.png +0 -0
  21. data/html/images/brick.png +0 -0
  22. data/html/images/brick_link.png +0 -0
  23. data/html/images/bug.png +0 -0
  24. data/html/images/bullet_black.png +0 -0
  25. data/html/images/bullet_toggle_minus.png +0 -0
  26. data/html/images/bullet_toggle_plus.png +0 -0
  27. data/html/images/date.png +0 -0
  28. data/html/images/delete.png +0 -0
  29. data/html/images/find.png +0 -0
  30. data/html/images/loadingAnimation.gif +0 -0
  31. data/html/images/macFFBgHack.png +0 -0
  32. data/html/images/package.png +0 -0
  33. data/html/images/page_green.png +0 -0
  34. data/html/images/page_white_text.png +0 -0
  35. data/html/images/page_white_width.png +0 -0
  36. data/html/images/plugin.png +0 -0
  37. data/html/images/ruby.png +0 -0
  38. data/html/images/tag_blue.png +0 -0
  39. data/html/images/tag_green.png +0 -0
  40. data/html/images/transparent.png +0 -0
  41. data/html/images/wrench.png +0 -0
  42. data/html/images/wrench_orange.png +0 -0
  43. data/html/images/zoom.png +0 -0
  44. data/html/index.html +0 -155
  45. data/html/js/darkfish.js +0 -161
  46. data/html/js/jquery.js +0 -4
  47. data/html/js/navigation.js +0 -142
  48. data/html/js/navigation.js.gz +0 -0
  49. data/html/js/search.js +0 -109
  50. data/html/js/search_index.js +0 -1
  51. data/html/js/search_index.js.gz +0 -0
  52. data/html/js/searcher.js +0 -228
  53. data/html/js/searcher.js.gz +0 -0
  54. data/html/table_of_contents.html +0 -144
@@ -1,960 +0,0 @@
1
- <!DOCTYPE html>
2
-
3
- <html>
4
- <head>
5
- <meta charset="UTF-8">
6
-
7
- <title>module CachedCounts::ClassMethods - RDoc Documentation</title>
8
-
9
- <script type="text/javascript">
10
- var rdoc_rel_prefix = "../";
11
- </script>
12
-
13
- <script src="../js/jquery.js"></script>
14
- <script src="../js/darkfish.js"></script>
15
-
16
- <link href="../css/fonts.css" rel="stylesheet">
17
- <link href="../css/rdoc.css" rel="stylesheet">
18
-
19
-
20
-
21
- <body id="top" role="document" class="module">
22
- <nav role="navigation">
23
- <div id="project-navigation">
24
- <div id="home-section" role="region" title="Quick navigation" class="nav-section">
25
- <h2>
26
- <a href="../index.html" rel="home">Home</a>
27
- </h2>
28
-
29
- <div id="table-of-contents-navigation">
30
- <a href="../table_of_contents.html#pages">Pages</a>
31
- <a href="../table_of_contents.html#classes">Classes</a>
32
- <a href="../table_of_contents.html#methods">Methods</a>
33
- </div>
34
- </div>
35
-
36
- <div id="search-section" role="search" class="project-section initially-hidden">
37
- <form action="#" method="get" accept-charset="utf-8">
38
- <div id="search-field-wrapper">
39
- <input id="search-field" role="combobox" aria-label="Search"
40
- aria-autocomplete="list" aria-controls="search-results"
41
- type="text" name="search" placeholder="Search" spellcheck="false"
42
- title="Type to search, Up and Down to navigate, Enter to load">
43
- </div>
44
-
45
- <ul id="search-results" aria-label="Search Results"
46
- aria-busy="false" aria-expanded="false"
47
- aria-atomic="false" class="initially-hidden"></ul>
48
- </form>
49
- </div>
50
-
51
- </div>
52
-
53
-
54
-
55
- <div id="class-metadata">
56
-
57
-
58
-
59
-
60
- <!-- Method Quickref -->
61
- <div id="method-list-section" class="nav-section">
62
- <h3>Methods</h3>
63
-
64
- <ul class="link-list" role="directory">
65
-
66
- <li ><a href="#method-i-add_association_counting_hooks">#add_association_counting_hooks</a>
67
-
68
- <li ><a href="#method-i-add_count_attribute_methods">#add_count_attribute_methods</a>
69
-
70
- <li ><a href="#method-i-add_counting_hooks">#add_counting_hooks</a>
71
-
72
- <li ><a href="#method-i-add_scope_counting_hooks">#add_scope_counting_hooks</a>
73
-
74
- <li ><a href="#method-i-association_count_key">#association_count_key</a>
75
-
76
- <li ><a href="#method-i-caches_count_of">#caches_count_of</a>
77
-
78
- <li ><a href="#method-i-caches_count_of-21">#caches_count_of!</a>
79
-
80
- <li ><a href="#method-i-caches_count_where">#caches_count_where</a>
81
-
82
- <li ><a href="#method-i-caches_count_where-21">#caches_count_where!</a>
83
-
84
- <li ><a href="#method-i-default_race_condition_fallback_proc">#default_race_condition_fallback_proc</a>
85
-
86
- <li ><a href="#method-i-define_association_count_attribute">#define_association_count_attribute</a>
87
-
88
- <li ><a href="#method-i-define_scope_count_attribute">#define_scope_count_attribute</a>
89
-
90
- <li ><a href="#method-i-generate_association_counting_hook_key_getter">#generate_association_counting_hook_key_getter</a>
91
-
92
- <li ><a href="#method-i-generate_association_relation_getter">#generate_association_relation_getter</a>
93
-
94
- <li ><a href="#method-i-scope_count_key">#scope_count_key</a>
95
-
96
- </ul>
97
- </div>
98
-
99
- </div>
100
- </nav>
101
-
102
- <main role="main" aria-labelledby="module-CachedCounts::ClassMethods">
103
- <h1 id="module-CachedCounts::ClassMethods" class="module">
104
- module CachedCounts::ClassMethods
105
- </h1>
106
-
107
- <section class="description">
108
-
109
- </section>
110
-
111
-
112
-
113
-
114
- <section id="5Buntitled-5D" class="documentation-section">
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
- <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
125
- <header>
126
- <h3>Public Instance Methods</h3>
127
- </header>
128
-
129
-
130
- <div id="method-i-association_count_key" class="method-detail ">
131
-
132
- <div class="method-heading">
133
- <span class="method-name">association_count_key</span><span
134
- class="method-args">(counter_id, attribute_name, version = 1)</span>
135
-
136
- <span class="method-click-advice">click to toggle source</span>
137
-
138
- </div>
139
-
140
-
141
- <div class="method-description">
142
-
143
-
144
-
145
-
146
-
147
-
148
- <div class="method-source-code" id="association_count_key-source">
149
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 98</span>
150
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">association_count_key</span>(<span class="ruby-identifier">counter_id</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span> = <span class="ruby-value">1</span>)
151
- <span class="ruby-node">&quot;#{name}:#{counter_id}:#{attribute_name}_count:#{version}&quot;</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">counter_id</span>.<span class="ruby-identifier">nil?</span>
152
- <span class="ruby-keyword">end</span></pre>
153
- </div>
154
-
155
- </div>
156
-
157
-
158
-
159
-
160
- </div>
161
-
162
-
163
- <div id="method-i-caches_count_of" class="method-detail ">
164
-
165
- <div class="method-heading">
166
- <span class="method-name">caches_count_of</span><span
167
- class="method-args">(attribute_name, options = {})</span>
168
-
169
- <span class="method-click-advice">click to toggle source</span>
170
-
171
- </div>
172
-
173
-
174
- <div class="method-description">
175
-
176
- <p>Cache the count for an association in memcached.</p>
177
-
178
- <p>e.g.</p>
179
-
180
- <pre>User.caches_count_of :friends
181
- &gt; User.first.friends_count # Users.first.friends.count, but cached</pre>
182
-
183
- <p>Automatically adds after_commit hooks to the associated class which
184
- increment/decrement the value in memcached when needed. Queries the db on
185
- cache miss.</p>
186
-
187
- <p>Valid options:</p>
188
-
189
- <pre>:association
190
- Name of the association to count. Defaults to the attribute_name
191
- (the required argument to `caches_count_of`).
192
-
193
- :alias
194
- Alias(es) for the count attribute. Useful with join tables.
195
- e.g. `caches_count_of :user_departments, alias: &#39;users&#39;`
196
- &gt; Department.first.users_count
197
-
198
- :expires_in
199
- Expiry for the cached value.
200
-
201
- :if
202
- proc passed through to the after_commit hooks on the counted class;
203
- decides whether an object counts towards the association total.
204
-
205
- :scope
206
- proc used like an ActiveRecord scope on the counted class on cache misses.
207
-
208
- :version
209
- Cache version - bump if you change the definition of a count.</pre>
210
-
211
-
212
-
213
-
214
- <div class="method-source-code" id="caches_count_of-source">
215
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 86</span>
216
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">caches_count_of</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span> = {})
217
- <span class="ruby-comment"># Delay actual run to work around circular dependencies</span>
218
- <span class="ruby-identifier">klass</span> = <span class="ruby-keyword">self</span>
219
- <span class="ruby-constant">ActiveSupport</span>.<span class="ruby-identifier">on_load</span> <span class="ruby-value">:cached_counts</span> <span class="ruby-keyword">do</span>
220
- <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">send</span> <span class="ruby-value">:caches_count_of!</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>
221
- <span class="ruby-keyword">end</span>
222
- <span class="ruby-keyword">end</span></pre>
223
- </div>
224
-
225
- </div>
226
-
227
-
228
-
229
-
230
- </div>
231
-
232
-
233
- <div id="method-i-caches_count_where" class="method-detail ">
234
-
235
- <div class="method-heading">
236
- <span class="method-name">caches_count_where</span><span
237
- class="method-args">(attribute_name, options = {})</span>
238
-
239
- <span class="method-click-advice">click to toggle source</span>
240
-
241
- </div>
242
-
243
-
244
- <div class="method-description">
245
-
246
- <p>Cache the count for a scope in memcached.</p>
247
-
248
- <p>e.g.</p>
249
-
250
- <pre>User.caches_count_where :confirmed
251
- &gt; User.confirmed_count # User.confirmed.count, but cached</pre>
252
-
253
- <p>Automatically adds after_commit hooks which increment/decrement the value
254
- in memcached when needed. Queries the db on cache miss.</p>
255
-
256
- <p>Valid options:</p>
257
-
258
- <pre>:scope
259
- Name of the scope to count. Defaults to the attribute_name
260
- (the required argument to `caches_count_where`).
261
-
262
- :alias
263
- Alias(es) for the count attribute.
264
- e.g. `caches_count_where :confirmed, alias: &#39;sitemap&#39;`
265
- &gt; User.sitemap_count
266
-
267
- :expires_in
268
- Expiry for the cached value.
269
-
270
- :if
271
- proc passed through to the after_commit hooks;
272
- decides whether an object counts towards the association total.
273
-
274
- :version
275
- Cache version - bump if you change the definition of a count.
276
-
277
- :race_condition_fallback
278
- Fallback to the result of this proc if the cache is empty, while
279
- loading the actual value from the db. Works similarly to
280
- race_condition_ttl but for empty caches rather than expired values.
281
- Meant to prevent a thundering-herd scenario, if for example a
282
- memcached instance goes away. Can be nil; defaults to using a value
283
- grabbed from the cache or DB at startup.</pre>
284
-
285
-
286
-
287
-
288
- <div class="method-source-code" id="caches_count_where-source">
289
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 45</span>
290
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">caches_count_where</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span> = {})
291
- <span class="ruby-comment"># Delay actual run to work around circular dependencies</span>
292
- <span class="ruby-identifier">klass</span> = <span class="ruby-keyword">self</span>
293
- <span class="ruby-constant">ActiveSupport</span>.<span class="ruby-identifier">on_load</span> <span class="ruby-value">:cached_counts</span> <span class="ruby-keyword">do</span>
294
- <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">send</span> <span class="ruby-value">:caches_count_where!</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>
295
- <span class="ruby-keyword">end</span>
296
- <span class="ruby-keyword">end</span></pre>
297
- </div>
298
-
299
- </div>
300
-
301
-
302
-
303
-
304
- </div>
305
-
306
-
307
- <div id="method-i-scope_count_key" class="method-detail ">
308
-
309
- <div class="method-heading">
310
- <span class="method-name">scope_count_key</span><span
311
- class="method-args">(attribute_name, version = 1)</span>
312
-
313
- <span class="method-click-advice">click to toggle source</span>
314
-
315
- </div>
316
-
317
-
318
- <div class="method-description">
319
-
320
-
321
-
322
-
323
-
324
-
325
- <div class="method-source-code" id="scope_count_key-source">
326
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 94</span>
327
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">scope_count_key</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span> = <span class="ruby-value">1</span>)
328
- <span class="ruby-node">&quot;#{name}:#{attribute_name}_count:#{version}&quot;</span>
329
- <span class="ruby-keyword">end</span></pre>
330
- </div>
331
-
332
- </div>
333
-
334
-
335
-
336
-
337
- </div>
338
-
339
-
340
- </section>
341
-
342
- <section id="protected-instance-5Buntitled-5D-method-details" class="method-section">
343
- <header>
344
- <h3>Protected Instance Methods</h3>
345
- </header>
346
-
347
-
348
- <div id="method-i-add_association_counting_hooks" class="method-detail ">
349
-
350
- <div class="method-heading">
351
- <span class="method-name">add_association_counting_hooks</span><span
352
- class="method-args">(attribute_name, association, options)</span>
353
-
354
- <span class="method-click-advice">click to toggle source</span>
355
-
356
- </div>
357
-
358
-
359
- <div class="method-description">
360
-
361
-
362
-
363
-
364
-
365
-
366
- <div class="method-source-code" id="add_association_counting_hooks-source">
367
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 204</span>
368
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">add_association_counting_hooks</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">association</span>, <span class="ruby-identifier">options</span>)
369
- <span class="ruby-identifier">key_getter</span> = <span class="ruby-identifier">generate_association_counting_hook_key_getter</span> <span class="ruby-identifier">association</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>
370
-
371
- <span class="ruby-identifier">add_counting_hooks</span>(
372
- <span class="ruby-node">&quot;#{name.demodulize.underscore}_#{attribute_name}&quot;</span>,
373
- <span class="ruby-identifier">key_getter</span>,
374
- <span class="ruby-identifier">association</span>.<span class="ruby-identifier">klass</span>,
375
- <span class="ruby-identifier">options</span>
376
- )
377
- <span class="ruby-keyword">end</span></pre>
378
- </div>
379
-
380
- </div>
381
-
382
-
383
-
384
-
385
- </div>
386
-
387
-
388
- <div id="method-i-add_count_attribute_methods" class="method-detail ">
389
-
390
- <div class="method-heading">
391
- <span class="method-name">add_count_attribute_methods</span><span
392
- class="method-args">(attribute_name, key_getter, relation_getter, define_with, counted_class, options)</span>
393
-
394
- <span class="method-click-advice">click to toggle source</span>
395
-
396
- </div>
397
-
398
-
399
- <div class="method-description">
400
-
401
-
402
-
403
-
404
-
405
-
406
- <div class="method-source-code" id="add_count_attribute_methods-source">
407
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 215</span>
408
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">add_count_attribute_methods</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">key_getter</span>, <span class="ruby-identifier">relation_getter</span>, <span class="ruby-identifier">define_with</span>, <span class="ruby-identifier">counted_class</span>, <span class="ruby-identifier">options</span>)
409
- <span class="ruby-identifier">expires_in</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:expires_in</span>, <span class="ruby-value">1</span>.<span class="ruby-identifier">week</span>
410
- <span class="ruby-identifier">race_condition_fallback</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:race_condition_fallback</span>, <span class="ruby-keyword">nil</span>
411
-
412
- <span class="ruby-identifier">key_method</span> = <span class="ruby-node">&quot;#{attribute_name}_count_key&quot;</span>
413
-
414
- <span class="ruby-identifier">send</span> <span class="ruby-identifier">define_with</span>, <span class="ruby-identifier">key_method</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">key_getter</span>
415
-
416
- <span class="ruby-identifier">send</span> <span class="ruby-identifier">define_with</span>, <span class="ruby-node">&quot;#{attribute_name}_count&quot;</span> <span class="ruby-keyword">do</span>
417
- <span class="ruby-identifier">val</span> = <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">fetch</span>(
418
- <span class="ruby-identifier">send</span>(<span class="ruby-identifier">key_method</span>),
419
- <span class="ruby-identifier">expires_in</span><span class="ruby-operator">:</span> <span class="ruby-identifier">expires_in</span>,
420
- <span class="ruby-identifier">race_condition_ttl</span><span class="ruby-operator">:</span> <span class="ruby-value">30</span>.<span class="ruby-identifier">seconds</span>,
421
- <span class="ruby-identifier">raw</span><span class="ruby-operator">:</span> <span class="ruby-keyword">true</span> <span class="ruby-comment"># Necessary for incrementing to work correctly</span>
422
- ) <span class="ruby-keyword">do</span>
423
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">race_condition_fallback</span>
424
- <span class="ruby-comment"># Ensure that other reads find something in the cache, but</span>
425
- <span class="ruby-comment"># continue calculating here because the default is likely inaccurate.</span>
426
- <span class="ruby-identifier">fallback_value</span> = <span class="ruby-identifier">instance_exec</span> <span class="ruby-operator">&amp;</span><span class="ruby-identifier">race_condition_fallback</span>
427
- <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">write</span>(
428
- <span class="ruby-identifier">send</span>(<span class="ruby-identifier">key_method</span>),
429
- <span class="ruby-identifier">fallback_value</span>.<span class="ruby-identifier">to_i</span>,
430
- <span class="ruby-identifier">expires_in</span><span class="ruby-operator">:</span> <span class="ruby-value">30</span>.<span class="ruby-identifier">seconds</span>,
431
- <span class="ruby-identifier">raw</span><span class="ruby-operator">:</span> <span class="ruby-keyword">true</span>
432
- )
433
- <span class="ruby-keyword">end</span>
434
-
435
- <span class="ruby-identifier">relation</span> = <span class="ruby-identifier">instance_exec</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">relation_getter</span>)
436
- <span class="ruby-identifier">relation</span> = <span class="ruby-identifier">relation</span>.<span class="ruby-identifier">reorder</span>(<span class="ruby-string">&#39;&#39;</span>)
437
- <span class="ruby-identifier">relation</span>.<span class="ruby-identifier">select_values</span> = [<span class="ruby-string">&#39;count(*)&#39;</span>]
438
-
439
- <span class="ruby-identifier">conn</span> = <span class="ruby-constant">CachedCounts</span>.<span class="ruby-identifier">connection_for</span>(<span class="ruby-identifier">counted_class</span>)
440
- <span class="ruby-keyword">if</span> <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">version</span> <span class="ruby-operator">&lt;</span> <span class="ruby-string">&#39;4.2&#39;</span>.<span class="ruby-identifier">freeze</span>
441
- <span class="ruby-identifier">conn</span>.<span class="ruby-identifier">select_value</span>(<span class="ruby-identifier">relation</span>.<span class="ruby-identifier">to_sql</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-identifier">relation</span>.<span class="ruby-identifier">values</span>[<span class="ruby-value">:bind</span>] <span class="ruby-operator">||</span> []).<span class="ruby-identifier">to_i</span>
442
- <span class="ruby-keyword">else</span>
443
- <span class="ruby-identifier">conn</span>.<span class="ruby-identifier">select_value</span>(<span class="ruby-identifier">relation</span>.<span class="ruby-identifier">to_sql</span>).<span class="ruby-identifier">to_i</span>
444
- <span class="ruby-keyword">end</span>
445
- <span class="ruby-keyword">end</span>
446
-
447
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">val</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">ActiveSupport</span><span class="ruby-operator">::</span><span class="ruby-constant">Cache</span><span class="ruby-operator">::</span><span class="ruby-constant">Entry</span>)
448
- <span class="ruby-identifier">val</span>.<span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_i</span>
449
- <span class="ruby-keyword">else</span>
450
- <span class="ruby-identifier">val</span>.<span class="ruby-identifier">to_i</span>
451
- <span class="ruby-keyword">end</span>
452
- <span class="ruby-keyword">end</span>
453
-
454
- <span class="ruby-identifier">send</span> <span class="ruby-identifier">define_with</span>, <span class="ruby-node">&quot;#{attribute_name}_count=&quot;</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
455
- <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">write</span>(
456
- <span class="ruby-identifier">send</span>(<span class="ruby-identifier">key_method</span>),
457
- <span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_i</span>,
458
- <span class="ruby-identifier">expires_in</span><span class="ruby-operator">:</span> <span class="ruby-identifier">expires_in</span>,
459
- <span class="ruby-identifier">raw</span><span class="ruby-operator">:</span> <span class="ruby-keyword">true</span>
460
- )
461
- <span class="ruby-keyword">end</span>
462
-
463
- <span class="ruby-identifier">send</span> <span class="ruby-identifier">define_with</span>, <span class="ruby-node">&quot;expire_#{attribute_name}_count&quot;</span> <span class="ruby-keyword">do</span>
464
- <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">delete</span> <span class="ruby-identifier">send</span>(<span class="ruby-identifier">key_method</span>)
465
- <span class="ruby-keyword">end</span>
466
- <span class="ruby-keyword">end</span></pre>
467
- </div>
468
-
469
- </div>
470
-
471
-
472
-
473
-
474
- </div>
475
-
476
-
477
- <div id="method-i-add_counting_hooks" class="method-detail ">
478
-
479
- <div class="method-heading">
480
- <span class="method-name">add_counting_hooks</span><span
481
- class="method-args">(attribute_name, key_getter, counted_class, options)</span>
482
-
483
- <span class="method-click-advice">click to toggle source</span>
484
-
485
- </div>
486
-
487
-
488
- <div class="method-description">
489
-
490
-
491
-
492
-
493
-
494
-
495
- <div class="method-source-code" id="add_counting_hooks-source">
496
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 275</span>
497
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">add_counting_hooks</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">key_getter</span>, <span class="ruby-identifier">counted_class</span>, <span class="ruby-identifier">options</span>)
498
- <span class="ruby-identifier">increment_hook</span> = <span class="ruby-node">&quot;increment_#{attribute_name}_count&quot;</span>
499
- <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">send</span> <span class="ruby-value">:define_method</span>, <span class="ruby-identifier">increment_hook</span> <span class="ruby-keyword">do</span>
500
- <span class="ruby-keyword">if</span> (<span class="ruby-identifier">key</span> = <span class="ruby-identifier">instance_exec</span> <span class="ruby-operator">&amp;</span><span class="ruby-identifier">key_getter</span>)
501
- <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">increment</span>(
502
- <span class="ruby-identifier">key</span>,
503
- <span class="ruby-value">1</span>,
504
- <span class="ruby-identifier">initial</span><span class="ruby-operator">:</span> <span class="ruby-keyword">nil</span> <span class="ruby-comment"># Increment only if the key already exists</span>
505
- )
506
- <span class="ruby-keyword">end</span>
507
- <span class="ruby-keyword">end</span>
508
-
509
- <span class="ruby-identifier">decrement_hook</span> = <span class="ruby-node">&quot;decrement_#{attribute_name}_count&quot;</span>
510
- <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">send</span> <span class="ruby-value">:define_method</span>, <span class="ruby-identifier">decrement_hook</span> <span class="ruby-keyword">do</span>
511
- <span class="ruby-keyword">if</span> (<span class="ruby-identifier">key</span> = <span class="ruby-identifier">instance_exec</span> <span class="ruby-operator">&amp;</span><span class="ruby-identifier">key_getter</span>)
512
- <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">decrement</span>(
513
- <span class="ruby-identifier">key</span>,
514
- <span class="ruby-value">1</span>,
515
- <span class="ruby-identifier">initial</span><span class="ruby-operator">:</span> <span class="ruby-keyword">nil</span> <span class="ruby-comment"># Decrement only if the key already exists</span>
516
- )
517
- <span class="ruby-keyword">end</span>
518
- <span class="ruby-keyword">end</span>
519
-
520
- <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">after_commit</span> <span class="ruby-identifier">increment_hook</span>, <span class="ruby-identifier">options</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">:if</span>).<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">on</span><span class="ruby-operator">:</span> <span class="ruby-value">:create</span>)
521
-
522
- <span class="ruby-keyword">if</span> (<span class="ruby-identifier">if_proc</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:if</span>])
523
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">if_proc</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Symbol</span>)
524
- <span class="ruby-identifier">if_proc</span> = <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span>{ <span class="ruby-identifier">send</span>(<span class="ruby-identifier">options</span>[<span class="ruby-value">:if</span>]) }
525
- <span class="ruby-keyword">end</span>
526
-
527
- <span class="ruby-identifier">recorded_eligibility_var</span> = <span class="ruby-node">&quot;@_was_eligible_for_#{attribute_name}_count&quot;</span>
528
- <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">before_destroy</span> <span class="ruby-keyword">do</span>
529
- <span class="ruby-identifier">instance_variable_set</span> <span class="ruby-identifier">recorded_eligibility_var</span>, <span class="ruby-operator">!</span><span class="ruby-operator">!</span><span class="ruby-identifier">instance_exec</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">if_proc</span>)
530
- <span class="ruby-keyword">true</span>
531
- <span class="ruby-keyword">end</span>
532
- <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">after_commit</span> <span class="ruby-identifier">on</span><span class="ruby-operator">:</span> <span class="ruby-value">:destroy</span> <span class="ruby-keyword">do</span>
533
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">instance_variable_get</span>(<span class="ruby-identifier">recorded_eligibility_var</span>)
534
- <span class="ruby-identifier">send</span>(<span class="ruby-identifier">decrement_hook</span>)
535
- <span class="ruby-keyword">end</span>
536
- <span class="ruby-keyword">end</span>
537
-
538
- <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">after_commit</span> <span class="ruby-identifier">on</span><span class="ruby-operator">:</span> <span class="ruby-value">:update</span> <span class="ruby-keyword">do</span>
539
- <span class="ruby-comment"># There is no before-hook which will reliably have access to the</span>
540
- <span class="ruby-comment"># previous version of the object, so we need to simulate it.</span>
541
- <span class="ruby-identifier">previous_values</span> = <span class="ruby-identifier">previous_changes</span>.<span class="ruby-identifier">each_with_object</span>({}) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span>(<span class="ruby-identifier">key</span>,<span class="ruby-identifier">vals</span>), <span class="ruby-identifier">memo</span><span class="ruby-operator">|</span>
542
- <span class="ruby-identifier">memo</span>[<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">vals</span>.<span class="ruby-identifier">first</span>
543
- <span class="ruby-keyword">end</span>
544
-
545
- <span class="ruby-identifier">old_version</span> = <span class="ruby-identifier">dup</span>
546
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">previous_values</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value">:permitted?</span>)
547
- <span class="ruby-identifier">old_version</span>.<span class="ruby-identifier">assign_attributes</span> <span class="ruby-identifier">previous_values</span>, <span class="ruby-identifier">without_protection</span><span class="ruby-operator">:</span> <span class="ruby-keyword">true</span>
548
- <span class="ruby-keyword">else</span>
549
- <span class="ruby-identifier">old_version</span>.<span class="ruby-identifier">assign_attributes</span> <span class="ruby-identifier">previous_values</span>
550
- <span class="ruby-keyword">end</span>
551
-
552
- <span class="ruby-identifier">was</span> = <span class="ruby-operator">!</span><span class="ruby-operator">!</span><span class="ruby-identifier">old_version</span>.<span class="ruby-identifier">instance_exec</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">if_proc</span>)
553
- <span class="ruby-identifier">is</span> = <span class="ruby-operator">!</span><span class="ruby-operator">!</span><span class="ruby-identifier">instance_exec</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">if_proc</span>)
554
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">was</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">is</span>
555
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">is</span>
556
- <span class="ruby-identifier">send</span>(<span class="ruby-identifier">increment_hook</span>)
557
- <span class="ruby-keyword">else</span>
558
- <span class="ruby-identifier">send</span>(<span class="ruby-identifier">decrement_hook</span>)
559
- <span class="ruby-keyword">end</span>
560
- <span class="ruby-keyword">end</span>
561
- <span class="ruby-keyword">end</span>
562
- <span class="ruby-keyword">else</span>
563
- <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">after_commit</span> <span class="ruby-identifier">decrement_hook</span>, <span class="ruby-identifier">on</span><span class="ruby-operator">:</span> <span class="ruby-value">:destroy</span>
564
- <span class="ruby-keyword">end</span>
565
- <span class="ruby-keyword">end</span></pre>
566
- </div>
567
-
568
- </div>
569
-
570
-
571
-
572
-
573
- </div>
574
-
575
-
576
- <div id="method-i-add_scope_counting_hooks" class="method-detail ">
577
-
578
- <div class="method-heading">
579
- <span class="method-name">add_scope_counting_hooks</span><span
580
- class="method-args">(attribute_name, options)</span>
581
-
582
- <span class="method-click-advice">click to toggle source</span>
583
-
584
- </div>
585
-
586
-
587
- <div class="method-description">
588
-
589
-
590
-
591
-
592
-
593
-
594
- <div class="method-source-code" id="add_scope_counting_hooks-source">
595
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 192</span>
596
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">add_scope_counting_hooks</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>)
597
- <span class="ruby-identifier">version</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:version</span>, <span class="ruby-value">1</span>
598
- <span class="ruby-identifier">key</span> = <span class="ruby-identifier">scope_count_key</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span>)
599
-
600
- <span class="ruby-identifier">add_counting_hooks</span>(
601
- <span class="ruby-identifier">attribute_name</span>,
602
- <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span> { <span class="ruby-identifier">key</span> },
603
- <span class="ruby-keyword">self</span>,
604
- <span class="ruby-identifier">options</span>
605
- )
606
- <span class="ruby-keyword">end</span></pre>
607
- </div>
608
-
609
- </div>
610
-
611
-
612
-
613
-
614
- </div>
615
-
616
-
617
- <div id="method-i-caches_count_of-21" class="method-detail ">
618
-
619
- <div class="method-heading">
620
- <span class="method-name">caches_count_of!</span><span
621
- class="method-args">(attribute_name, options)</span>
622
-
623
- <span class="method-click-advice">click to toggle source</span>
624
-
625
- </div>
626
-
627
-
628
- <div class="method-description">
629
-
630
-
631
-
632
-
633
-
634
-
635
- <div class="method-source-code" id="caches_count_of-21-source">
636
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 113</span>
637
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">caches_count_of!</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>)
638
- <span class="ruby-identifier">association_name</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:association</span>, <span class="ruby-identifier">attribute_name</span>
639
- <span class="ruby-identifier">association</span> = <span class="ruby-identifier">reflect_on_association</span>(<span class="ruby-identifier">association_name</span>.<span class="ruby-identifier">to_sym</span>)
640
- <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;#{self} does not have an association named #{association_name}&quot;</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">association</span>
641
-
642
- <span class="ruby-identifier">define_association_count_attribute</span> <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">association</span>, <span class="ruby-identifier">options</span>
643
- <span class="ruby-identifier">add_association_counting_hooks</span> <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">association</span>, <span class="ruby-identifier">options</span>
644
- <span class="ruby-keyword">end</span></pre>
645
- </div>
646
-
647
- </div>
648
-
649
-
650
-
651
-
652
- </div>
653
-
654
-
655
- <div id="method-i-caches_count_where-21" class="method-detail ">
656
-
657
- <div class="method-heading">
658
- <span class="method-name">caches_count_where!</span><span
659
- class="method-args">(attribute_name, options)</span>
660
-
661
- <span class="method-click-advice">click to toggle source</span>
662
-
663
- </div>
664
-
665
-
666
- <div class="method-description">
667
-
668
-
669
-
670
-
671
-
672
-
673
- <div class="method-source-code" id="caches_count_where-21-source">
674
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 104</span>
675
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">caches_count_where!</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>)
676
- <span class="ruby-identifier">scope_name</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:scope</span>, <span class="ruby-identifier">attribute_name</span>
677
- <span class="ruby-identifier">relation</span> = <span class="ruby-identifier">send</span>(<span class="ruby-identifier">scope_name</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">respond_to?</span>(<span class="ruby-identifier">scope_name</span>)
678
- <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;#{self} does not have a scope named #{scope_name}&quot;</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">relation</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Relation</span>)
679
-
680
- <span class="ruby-identifier">define_scope_count_attribute</span> <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">relation</span>, <span class="ruby-identifier">options</span>
681
- <span class="ruby-identifier">add_scope_counting_hooks</span> <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>
682
- <span class="ruby-keyword">end</span></pre>
683
- </div>
684
-
685
- </div>
686
-
687
-
688
-
689
-
690
- </div>
691
-
692
-
693
- <div id="method-i-default_race_condition_fallback_proc" class="method-detail ">
694
-
695
- <div class="method-heading">
696
- <span class="method-name">default_race_condition_fallback_proc</span><span
697
- class="method-args">(key, relation, options)</span>
698
-
699
- <span class="method-click-advice">click to toggle source</span>
700
-
701
- </div>
702
-
703
-
704
- <div class="method-description">
705
-
706
-
707
-
708
-
709
-
710
-
711
- <div class="method-source-code" id="default_race_condition_fallback_proc-source">
712
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 148</span>
713
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">default_race_condition_fallback_proc</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">relation</span>, <span class="ruby-identifier">options</span>)
714
- <span class="ruby-identifier">fallback</span> = <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">key</span>)
715
- <span class="ruby-identifier">fallback</span> = <span class="ruby-identifier">fallback</span>.<span class="ruby-identifier">value</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">fallback</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">ActiveSupport</span><span class="ruby-operator">::</span><span class="ruby-constant">Cache</span><span class="ruby-operator">::</span><span class="ruby-constant">Entry</span>)
716
-
717
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">fallback</span>.<span class="ruby-identifier">nil?</span>
718
- <span class="ruby-keyword">begin</span>
719
- <span class="ruby-identifier">fallback</span> = <span class="ruby-identifier">relation</span>.<span class="ruby-identifier">count</span>
720
- <span class="ruby-keyword">rescue</span> <span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">StatementInvalid</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
721
- <span class="ruby-identifier">fallback</span> = <span class="ruby-value">0</span>
722
- <span class="ruby-keyword">end</span>
723
-
724
- <span class="ruby-constant">Rails</span>.<span class="ruby-identifier">cache</span>.<span class="ruby-identifier">write</span> <span class="ruby-identifier">key</span>, <span class="ruby-identifier">fallback</span>, <span class="ruby-identifier">expires_in</span><span class="ruby-operator">:</span> <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span>(<span class="ruby-value">:expires_in</span>, <span class="ruby-value">1</span>.<span class="ruby-identifier">week</span>)
725
- <span class="ruby-keyword">end</span>
726
-
727
- <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span> { <span class="ruby-identifier">fallback</span> }
728
- <span class="ruby-keyword">end</span></pre>
729
- </div>
730
-
731
- </div>
732
-
733
-
734
-
735
-
736
- </div>
737
-
738
-
739
- <div id="method-i-define_association_count_attribute" class="method-detail ">
740
-
741
- <div class="method-heading">
742
- <span class="method-name">define_association_count_attribute</span><span
743
- class="method-args">(attribute_name, association, options)</span>
744
-
745
- <span class="method-click-advice">click to toggle source</span>
746
-
747
- </div>
748
-
749
-
750
- <div class="method-description">
751
-
752
-
753
-
754
-
755
-
756
-
757
- <div class="method-source-code" id="define_association_count_attribute-source">
758
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 165</span>
759
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">define_association_count_attribute</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">association</span>, <span class="ruby-identifier">options</span>)
760
- <span class="ruby-identifier">options</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">dup</span>
761
-
762
- <span class="ruby-identifier">version</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:version</span>, <span class="ruby-value">1</span>
763
- <span class="ruby-identifier">key_getter</span> = <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span> { <span class="ruby-keyword">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">association_count_key</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span>) }
764
- <span class="ruby-identifier">relation_getter</span> = <span class="ruby-identifier">generate_association_relation_getter</span>(<span class="ruby-identifier">association</span>, <span class="ruby-identifier">options</span>)
765
-
766
- [<span class="ruby-identifier">attribute_name</span>, <span class="ruby-operator">*</span><span class="ruby-constant">Array</span>(<span class="ruby-identifier">options</span>[<span class="ruby-value">:alias</span>])].<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">attr_name</span><span class="ruby-operator">|</span>
767
- <span class="ruby-identifier">define_singleton_method</span> <span class="ruby-node">&quot;#{attr_name}_count_key&quot;</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">id</span><span class="ruby-operator">|</span>
768
- <span class="ruby-identifier">association_count_key</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span>)
769
- <span class="ruby-keyword">end</span>
770
-
771
- <span class="ruby-identifier">define_singleton_method</span> <span class="ruby-node">&quot;#{attr_name}_count_for&quot;</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">id</span><span class="ruby-operator">|</span>
772
- <span class="ruby-identifier">new</span>({<span class="ruby-identifier">id</span><span class="ruby-operator">:</span> <span class="ruby-identifier">id</span>}, <span class="ruby-identifier">without_protection</span><span class="ruby-operator">:</span> <span class="ruby-keyword">true</span>).<span class="ruby-identifier">send</span>(<span class="ruby-node">&quot;#{attr_name}_count&quot;</span>)
773
- <span class="ruby-keyword">end</span>
774
-
775
- <span class="ruby-identifier">add_count_attribute_methods</span>(
776
- <span class="ruby-identifier">attr_name</span>,
777
- <span class="ruby-identifier">key_getter</span>,
778
- <span class="ruby-identifier">relation_getter</span>,
779
- <span class="ruby-value">:define_method</span>,
780
- <span class="ruby-identifier">association</span>.<span class="ruby-identifier">klass</span>,
781
- <span class="ruby-identifier">options</span>
782
- )
783
- <span class="ruby-keyword">end</span>
784
- <span class="ruby-keyword">end</span></pre>
785
- </div>
786
-
787
- </div>
788
-
789
-
790
-
791
-
792
- </div>
793
-
794
-
795
- <div id="method-i-define_scope_count_attribute" class="method-detail ">
796
-
797
- <div class="method-heading">
798
- <span class="method-name">define_scope_count_attribute</span><span
799
- class="method-args">(attribute_name, relation, options)</span>
800
-
801
- <span class="method-click-advice">click to toggle source</span>
802
-
803
- </div>
804
-
805
-
806
- <div class="method-description">
807
-
808
-
809
-
810
-
811
-
812
-
813
- <div class="method-source-code" id="define_scope_count_attribute-source">
814
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 122</span>
815
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">define_scope_count_attribute</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">relation</span>, <span class="ruby-identifier">options</span>)
816
- <span class="ruby-identifier">options</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">dup</span>
817
-
818
- <span class="ruby-identifier">version</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:version</span>, <span class="ruby-value">1</span>
819
- <span class="ruby-identifier">key</span> = <span class="ruby-identifier">scope_count_key</span>(<span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span>)
820
-
821
- <span class="ruby-keyword">unless</span> <span class="ruby-identifier">options</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-value">:race_condition_fallback</span>)
822
- <span class="ruby-identifier">options</span>[<span class="ruby-value">:race_condition_fallback</span>] = <span class="ruby-identifier">default_race_condition_fallback_proc</span>(
823
- <span class="ruby-identifier">key</span>,
824
- <span class="ruby-identifier">relation</span>,
825
- <span class="ruby-identifier">options</span>
826
- )
827
- <span class="ruby-keyword">end</span>
828
-
829
- [<span class="ruby-identifier">attribute_name</span>, <span class="ruby-operator">*</span><span class="ruby-constant">Array</span>(<span class="ruby-identifier">options</span>[<span class="ruby-value">:alias</span>])].<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">attr_name</span><span class="ruby-operator">|</span>
830
- <span class="ruby-identifier">add_count_attribute_methods</span>(
831
- <span class="ruby-identifier">attr_name</span>,
832
- <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span> { <span class="ruby-identifier">key</span> },
833
- <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span> { <span class="ruby-identifier">relation</span> },
834
- <span class="ruby-value">:define_singleton_method</span>,
835
- <span class="ruby-keyword">self</span>,
836
- <span class="ruby-identifier">options</span>
837
- )
838
- <span class="ruby-keyword">end</span>
839
- <span class="ruby-keyword">end</span></pre>
840
- </div>
841
-
842
- </div>
843
-
844
-
845
-
846
-
847
- </div>
848
-
849
-
850
- <div id="method-i-generate_association_counting_hook_key_getter" class="method-detail ">
851
-
852
- <div class="method-heading">
853
- <span class="method-name">generate_association_counting_hook_key_getter</span><span
854
- class="method-args">(association, attribute_name, options)</span>
855
-
856
- <span class="method-click-advice">click to toggle source</span>
857
-
858
- </div>
859
-
860
-
861
- <div class="method-description">
862
-
863
-
864
-
865
-
866
-
867
-
868
- <div class="method-source-code" id="generate_association_counting_hook_key_getter-source">
869
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 345</span>
870
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">generate_association_counting_hook_key_getter</span>(<span class="ruby-identifier">association</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">options</span>)
871
- <span class="ruby-identifier">version</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">fetch</span> <span class="ruby-value">:version</span>, <span class="ruby-value">1</span>
872
- <span class="ruby-identifier">counting_class</span> = <span class="ruby-keyword">self</span>
873
-
874
- <span class="ruby-keyword">if</span> <span class="ruby-identifier">association</span>.<span class="ruby-identifier">through_reflection</span>
875
- <span class="ruby-identifier">method_chain</span> = <span class="ruby-identifier">association</span>.<span class="ruby-identifier">chain</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">association</span><span class="ruby-operator">|</span>
876
- <span class="ruby-keyword">if</span> (<span class="ruby-identifier">source</span> = <span class="ruby-identifier">association</span>.<span class="ruby-identifier">source_reflection</span>)
877
- <span class="ruby-identifier">raise</span> <span class="ruby-string">&quot;Chained associations without `inverse_of` are not supported!&quot;</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">source</span>.<span class="ruby-identifier">inverse_of</span>
878
- <span class="ruby-identifier">source</span>.<span class="ruby-identifier">inverse_of</span>.<span class="ruby-identifier">name</span>
879
- <span class="ruby-keyword">else</span>
880
- <span class="ruby-identifier">association</span>.<span class="ruby-identifier">foreign_key</span>
881
- <span class="ruby-keyword">end</span>
882
- <span class="ruby-keyword">end</span>
883
-
884
- <span class="ruby-identifier">proc</span> <span class="ruby-keyword">do</span>
885
- <span class="ruby-identifier">counter_id</span> = <span class="ruby-identifier">method_chain</span>.<span class="ruby-identifier">inject</span>(<span class="ruby-keyword">self</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">memo</span>, <span class="ruby-identifier">method</span><span class="ruby-operator">|</span>
886
- <span class="ruby-identifier">memo</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">method</span>) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">memo</span>.<span class="ruby-identifier">nil?</span>
887
- <span class="ruby-keyword">end</span>
888
- <span class="ruby-identifier">counter_id</span> = <span class="ruby-identifier">counter_id</span>.<span class="ruby-identifier">id</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">counter_id</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>)
889
-
890
- <span class="ruby-identifier">counting_class</span>.<span class="ruby-identifier">association_count_key</span> <span class="ruby-identifier">counter_id</span>, <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span>
891
- <span class="ruby-keyword">end</span>
892
- <span class="ruby-keyword">else</span>
893
- <span class="ruby-identifier">foreign_key</span> = <span class="ruby-identifier">association</span>.<span class="ruby-identifier">foreign_key</span>
894
-
895
- <span class="ruby-identifier">proc</span> <span class="ruby-keyword">do</span>
896
- <span class="ruby-identifier">counting_class</span>.<span class="ruby-identifier">association_count_key</span> <span class="ruby-identifier">send</span>(<span class="ruby-identifier">foreign_key</span>), <span class="ruby-identifier">attribute_name</span>, <span class="ruby-identifier">version</span>
897
- <span class="ruby-keyword">end</span>
898
- <span class="ruby-keyword">end</span>
899
- <span class="ruby-keyword">end</span></pre>
900
- </div>
901
-
902
- </div>
903
-
904
-
905
-
906
-
907
- </div>
908
-
909
-
910
- <div id="method-i-generate_association_relation_getter" class="method-detail ">
911
-
912
- <div class="method-heading">
913
- <span class="method-name">generate_association_relation_getter</span><span
914
- class="method-args">(association, options)</span>
915
-
916
- <span class="method-click-advice">click to toggle source</span>
917
-
918
- </div>
919
-
920
-
921
- <div class="method-description">
922
-
923
-
924
-
925
-
926
-
927
-
928
- <div class="method-source-code" id="generate_association_relation_getter-source">
929
- <pre><span class="ruby-comment"># File lib/cached_counts.rb, line 376</span>
930
- <span class="ruby-keyword">def</span> <span class="ruby-identifier">generate_association_relation_getter</span>(<span class="ruby-identifier">association</span>, <span class="ruby-identifier">options</span>)
931
- <span class="ruby-identifier">counted_class</span> = <span class="ruby-identifier">association</span>.<span class="ruby-identifier">klass</span>
932
- <span class="ruby-identifier">association_name</span> = <span class="ruby-identifier">association</span>.<span class="ruby-identifier">name</span>
933
- <span class="ruby-keyword">if</span> (<span class="ruby-identifier">scope_proc</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:scope</span>])
934
- <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span> { <span class="ruby-identifier">send</span>(<span class="ruby-identifier">association_name</span>).<span class="ruby-identifier">spawn</span>.<span class="ruby-identifier">scoping</span> { <span class="ruby-identifier">counted_class</span>.<span class="ruby-identifier">instance_exec</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">scope_proc</span>) } }
935
- <span class="ruby-keyword">else</span>
936
- <span class="ruby-operator">-</span><span class="ruby-operator">&gt;</span> { <span class="ruby-identifier">send</span>(<span class="ruby-identifier">association_name</span>).<span class="ruby-identifier">spawn</span> }
937
- <span class="ruby-keyword">end</span>
938
- <span class="ruby-keyword">end</span></pre>
939
- </div>
940
-
941
- </div>
942
-
943
-
944
-
945
-
946
- </div>
947
-
948
-
949
- </section>
950
-
951
- </section>
952
- </main>
953
-
954
-
955
- <footer id="validator-badges" role="contentinfo">
956
- <p><a href="http://validator.w3.org/check/referer">Validate</a>
957
- <p>Generated by <a href="http://docs.seattlerb.org/rdoc/">RDoc</a> 4.2.0.
958
- <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
959
- </footer>
960
-