incrdecr_cached_counts 0.0.3 → 0.0.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.
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
-