File tree 3 files changed +55
-0
lines changed
lib/active_model/serializer/adapter
3 files changed +55
-0
lines changed Original file line number Diff line number Diff line change @@ -24,6 +24,13 @@ def fragment_cache(cached_hash, non_cached_hash)
24
24
private
25
25
26
26
def serializable_hash_for_collection ( options )
27
+ if options [ :batch_cache ] . blank? && ActiveModelSerializers . config . cache_store . present?
28
+ keys = CachedSerializer . object_cache_keys ( serializer , @include_tree )
29
+ values = ActiveModelSerializers . config . cache_store . read_multi ( *keys )
30
+
31
+ options . merge! ( batch_cache : values )
32
+ end
33
+
27
34
serializer . map { |s | Attributes . new ( s , instance_options ) . serializable_hash ( options ) }
28
35
end
29
36
@@ -56,6 +63,14 @@ def include_meta(json)
56
63
end
57
64
58
65
def resource_object_for ( options )
66
+ if options [ :batch_cache ] . present?
67
+ cache_key = CachedSerializer . new ( serializer ) . cache_key
68
+
69
+ value = options [ :batch_cache ] [ cache_key ]
70
+
71
+ return value if value . present?
72
+ end
73
+
59
74
cache_check ( serializer ) do
60
75
serializer . attributes ( options [ :fields ] )
61
76
end
Original file line number Diff line number Diff line change @@ -39,6 +39,34 @@ def object_cache_key
39
39
object_time_safe = object_time_safe . strftime ( '%Y%m%d%H%M%S%9N' ) if object_time_safe . respond_to? ( :strftime )
40
40
( @klass . _cache_key ) ? "#{ @klass . _cache_key } /#{ @cached_serializer . object . id } -#{ object_time_safe } " : @cached_serializer . object . cache_key
41
41
end
42
+
43
+ # collection_serializer with the include_tree
44
+ def self . object_cache_keys ( serializers , include_tree )
45
+ cache_keys = [ ]
46
+
47
+ serializers . each do |serializer |
48
+ cache_keys << object_cache_key ( serializer )
49
+
50
+ serializer . associations ( include_tree ) . each do |association |
51
+ if association . serializer . respond_to? ( :each )
52
+ association . serializer . each do |sub_serializer |
53
+ cache_keys << object_cache_key ( sub_serializer )
54
+ end
55
+ else
56
+ cache_keys << object_cache_key ( association . serializer )
57
+ end
58
+ end
59
+ end
60
+
61
+ cache_keys . compact
62
+ end
63
+
64
+ def self . object_cache_key ( serializer )
65
+ return unless serializer . present? && serializer . object . present?
66
+
67
+ cached_serializer = new ( serializer )
68
+ cached_serializer . cached? ? cached_serializer . cache_key : nil
69
+ end
42
70
end
43
71
end
44
72
end
Original file line number Diff line number Diff line change @@ -149,6 +149,18 @@ def test_cache_digest_definition
149
149
assert_equal ( ::Model ::FILE_DIGEST , @post_serializer . class . _cache_digest )
150
150
end
151
151
152
+ def test_object_cache_keys
153
+ serializer = CollectionSerializer . new ( [ @comment , @comment ] )
154
+ include_tree = IncludeTree . from_include_args ( '*' )
155
+
156
+ actual = Serializer ::Adapter ::CachedSerializer . object_cache_keys ( serializer , include_tree )
157
+
158
+ assert_equal actual . size , 6
159
+ assert actual . any? { |key | key == 'comment/1' }
160
+ assert actual . any? { |key | key =~ %r{post/post-\d +} }
161
+ assert actual . any? { |key | key =~ %r{writer/author-\d +} }
162
+ end
163
+
152
164
def test_serializer_file_path_on_nix
153
165
path = '/Users/git/emberjs/ember-crm-backend/app/serializers/lead_serializer.rb'
154
166
caller_line = "#{ path } :1:in `<top (required)>'"
You can’t perform that action at this time.
0 commit comments