volatile_counter_cache 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +0 -2
- data/lib/volatile_counter_cache/active_record.rb +3 -0
- data/lib/volatile_counter_cache/class_methods.rb +44 -0
- data/lib/volatile_counter_cache/version.rb +1 -1
- data/lib/volatile_counter_cache.rb +2 -45
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0dc0bb5209cea0920a758459442c6fac1cec1df9
|
4
|
+
data.tar.gz: 9f66c42130cf13c202640c9790f9a885364ffaee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eedac8adabcaf4e824a70ee78a9c19b8ece9cd3279c31f67de2d7cf28e483071d22fcac4517dbab255b8425c90090dc654af4242485c38371d3ee5e3bdc0b5fb
|
7
|
+
data.tar.gz: 5502399435fdc3c46bbe682bc1ebdbc031dd62849ec604403ea0adce3513154ff4ebee9c39f83d8cb6f541f2fa5be4f5efafbb2f42663fd65f745c40e77604e9
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
# A model concern module to provide volatile counter cache logic to model class.
|
2
|
+
#
|
3
|
+
# @example
|
4
|
+
# class Tweet < ActiveRecord::Base
|
5
|
+
# include VolatileCounterCache
|
6
|
+
# has_many :favorites
|
7
|
+
# volatile_counter_cache :favorites, cache: Rails.cache
|
8
|
+
# end
|
9
|
+
# Tweet.first.favorites_count #=> 42
|
10
|
+
# Tweet.first.favorites.first.destroy
|
11
|
+
# Tweet.first.favorites_count #=> 41
|
12
|
+
#
|
13
|
+
module VolatileCounterCache
|
14
|
+
CACHE_KEY_PREFIX = 'volatile-counter-cache'
|
15
|
+
|
16
|
+
extend ActiveSupport::Concern
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
# Define counter method and callback using given cache store for 1:N association.
|
20
|
+
# @param association_name [Symbol] Association name used to counter method, cache key, and counting.
|
21
|
+
# @param cache [ActiveSupport::Cache::Store] A store object to store count for each key.
|
22
|
+
# @param cache_options [Hash] Options for cache store.
|
23
|
+
# @param counter_method_name [String] An optional String to change counter method name.
|
24
|
+
# @param foreign_key [Symbol] An optional Symbol to change cache key at callback.
|
25
|
+
def volatile_counter_cache(association_name, cache:, cache_options: {}, counter_method_name: nil, foreign_key: nil)
|
26
|
+
counter_method_name = counter_method_name || "#{association_name}_count"
|
27
|
+
cache_key_prefix = "#{CACHE_KEY_PREFIX}/#{model_name}/#{association_name}"
|
28
|
+
|
29
|
+
define_method(counter_method_name) do
|
30
|
+
cache.fetch("#{cache_key_prefix}/#{id}", cache_options) do
|
31
|
+
send(association_name).count
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
foreign_key = foreign_key || "#{table_name.singularize }_id"
|
36
|
+
child_class = association_name.to_s.singularize.camelize.constantize
|
37
|
+
callback_proc = -> do
|
38
|
+
cache.delete("#{cache_key_prefix}/#{send(foreign_key)}", cache_options)
|
39
|
+
end
|
40
|
+
child_class.after_create(&callback_proc)
|
41
|
+
child_class.after_destroy(&callback_proc)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,46 +1,3 @@
|
|
1
1
|
require "volatile_counter_cache/version"
|
2
|
-
|
3
|
-
|
4
|
-
#
|
5
|
-
# @example
|
6
|
-
# class Tweet < ActiveRecord::Base
|
7
|
-
# include VolatileCounterCache
|
8
|
-
# has_many :favorites
|
9
|
-
# volatile_counter_cache :favorites, cache: Rails.cache
|
10
|
-
# end
|
11
|
-
# Tweet.first.favorites_count #=> 42
|
12
|
-
# Tweet.first.favorites.first.destroy
|
13
|
-
# Tweet.first.favorites_count #=> 41
|
14
|
-
#
|
15
|
-
module VolatileCounterCache
|
16
|
-
CACHE_KEY_PREFIX = 'volatile-counter-cache'
|
17
|
-
|
18
|
-
extend ActiveSupport::Concern
|
19
|
-
|
20
|
-
module ClassMethods
|
21
|
-
# Define counter method and callback using given cache store for 1:N association.
|
22
|
-
# @param association_name [Symbol] Association name used to counter method, cache key, and counting.
|
23
|
-
# @param cache [ActiveSupport::Cache::Store] A store object to store count for each key.
|
24
|
-
# @param cache_options [Hash] Options for cache store.
|
25
|
-
# @param counter_method_name [String] An optional String to change counter method name.
|
26
|
-
# @param foreign_key [Symbol] An optional Symbol to change cache key at callback.
|
27
|
-
def volatile_counter_cache(association_name, cache:, cache_options: {}, counter_method_name: nil, foreign_key: nil)
|
28
|
-
counter_method_name = counter_method_name || "#{association_name}_count"
|
29
|
-
cache_key_prefix = "#{CACHE_KEY_PREFIX}/#{model_name}/#{association_name}"
|
30
|
-
|
31
|
-
define_method(counter_method_name) do
|
32
|
-
cache.fetch("#{cache_key_prefix}/#{id}", cache_options) do
|
33
|
-
send(association_name).count
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
foreign_key = foreign_key || "#{table_name.singularize }_id"
|
38
|
-
child_class = association_name.to_s.singularize.camelize.constantize
|
39
|
-
callback_proc = -> do
|
40
|
-
cache.delete("#{cache_key_prefix}/#{send(foreign_key)}", cache_options)
|
41
|
-
end
|
42
|
-
child_class.after_create(&callback_proc)
|
43
|
-
child_class.after_destroy(&callback_proc)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
2
|
+
require "volatile_counter_cache/class_methods"
|
3
|
+
require "volatile_counter_cache/active_record"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: volatile_counter_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
@@ -46,11 +46,14 @@ extensions: []
|
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- ".gitignore"
|
49
|
+
- CHANGELOG.md
|
49
50
|
- Gemfile
|
50
51
|
- LICENSE.txt
|
51
52
|
- README.md
|
52
53
|
- Rakefile
|
53
54
|
- lib/volatile_counter_cache.rb
|
55
|
+
- lib/volatile_counter_cache/active_record.rb
|
56
|
+
- lib/volatile_counter_cache/class_methods.rb
|
54
57
|
- lib/volatile_counter_cache/version.rb
|
55
58
|
- volatile_counter_cache.gemspec
|
56
59
|
homepage: https://github.com/r7kamura/volatile_counter_cache
|