cache_associations 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f1dc1a88461b8ab8e50a2f7123a8940380b43b83
4
- data.tar.gz: c3e7a07d8abff7fe53c1f8fdf3e602bf7b2b3f10
3
+ metadata.gz: 9e111469fc100cc1a801fb5e200b959e703f86c7
4
+ data.tar.gz: 016c2fb36fed32d91e3e5b9c8641b4026277dbb6
5
5
  SHA512:
6
- metadata.gz: 42c3e4fef24eb6b6d85bbe56ce6b0f408b14659c000ed47164c056cc7d8753e3e37d81b6fe2818e205d9d2b94e44603f049b2011089d5a81bc0acc3caca29e17
7
- data.tar.gz: 1b00a1c669f913857b32e734252b79afcf1e1abc72d2a6f24eea9c3007a0d98364d02e0757df35e7047ef0438ac0a09c55a45c3b68913aa450f29f5e575c3012
6
+ metadata.gz: 4ded7fbf3e5c2dc204894d75e7825f6025df635273d6fb1bf50a5ab4cf501b27d9f2da5d6861ba6bf8163f0fab06818831074d01caac4c102f9d1f356e378b74
7
+ data.tar.gz: 59a811bb5464a536916dec9bb40d3edb74ea34ca5f71581390332cdb52a5383957b0627cbe60790078557c2d93a17333c005474ca08f43317f8af6c0916fcd98
data/README.md CHANGED
@@ -32,6 +32,11 @@ class User < ApplicationRecord
32
32
  # put your cache name here
33
33
  [self.class.name, id, 'profile', update_at.to_i]
34
34
  end
35
+
36
+ def factorial_1000
37
+ (1..1000).inject(:*)
38
+ end
39
+ cache_method :factorial_1000 # use cached_factorial_1000
35
40
  end
36
41
 
37
42
  class Profile < ApplicationRecord
@@ -44,12 +49,16 @@ You may also specify additional options via the options argument, it's the same
44
49
  such as setting `:expires_in` will set an expiration time on the cache.
45
50
  And `cache_association` accepts an optional block to define the cache name, it's `[self.class.name, id, name, updated_at.to_i]` in default.
46
51
 
52
+
53
+ You can use `cache_method` to cache something else, like attributes and methods.
54
+
47
55
  ```ruby
48
56
  irb> u = User.take
49
57
  irb> u.cached_profile # fetch from the cache store
50
58
  irb> u.profile # fetch the cached version
51
59
  irb> u.profile.reload # refetch from the database
52
60
  Profile Load (1.4ms) SELECT "profiles".* FROM "profiles" WHERE "profiles"."user_id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
61
+ irb> u.clear_caching_on_association(:profile) # clear the cache
53
62
  ```
54
63
 
55
64
  You may customize what the data you cached, the cached method accepts an optional block that determines how to cache data.
@@ -1,3 +1,3 @@
1
1
  module CacheAssociations
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -10,7 +10,7 @@ module CacheAssociations
10
10
  unless reflection = reflect_on_association(name)
11
11
  raise UndefinedAssociationError, "Undefined asscociation #{name}"
12
12
  end
13
- cache_association_names[name.to_sym] = cache_name_block
13
+ register_cache_name_block(name, cache_name_block)
14
14
  options = Rails.cache.options.merge(options)
15
15
 
16
16
  define_method("cached_#{name}") do |*args, &block|
@@ -34,23 +34,42 @@ module CacheAssociations
34
34
  cache
35
35
  end
36
36
  end
37
+
38
+ def cache_method(name, **options, &cache_name_block)
39
+ register_cache_name_block(name, cache_name_block)
40
+ options = Rails.cache.options.merge(options)
41
+
42
+ define_method("cached_#{name}") do |*args, &block|
43
+ cache_name = cache_name_block.nil? ? default_cache_name(name) : instance_exec(&cache_name_block)
44
+ Rails.cache.fetch(cache_name, **options) do
45
+ break instance_exec(*args, &block) if !block.nil?
46
+
47
+ send("#{name}", *args)
48
+ end
49
+ end
50
+ end
37
51
 
38
52
  def has_cache_association?(name)
39
- cache_association_names.has_key?(name.to_sym)
53
+ cache_name_blocks.has_key?(name.to_sym)
40
54
  end
41
55
 
42
56
  def custom_cache_name?(name)
43
- !!cache_association_names[name.to_sym]
57
+ !!cache_name_blocks[name.to_sym]
44
58
  end
45
59
 
46
60
  def cache_name_block(name)
47
- cache_association_names[name.to_sym]
61
+ cache_name_blocks[name.to_sym]
48
62
  end
49
63
 
50
64
  private
51
65
 
52
- def cache_association_names
53
- @cache_association_names ||= {}
66
+ def register_cache_name_block(name, cache_name_block)
67
+ warn "#{name} has been cached before." if has_cache_association?(name)
68
+ cache_name_blocks[name] = cache_name_block
69
+ end
70
+
71
+ def cache_name_blocks
72
+ @cache_name_blocks ||= {}
54
73
  end
55
74
  end
56
75
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cache_associations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fuxin Hao
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-23 00:00:00.000000000 Z
11
+ date: 2017-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails