Skip to content

Commit 66b67f5

Browse files
committed
support read_multi
1 parent f562449 commit 66b67f5

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

lib/active_model/serializer/adapter/attributes.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ def fragment_cache(cached_hash, non_cached_hash)
2424
private
2525

2626
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+
2734
serializer.map { |s| Attributes.new(s, instance_options).serializable_hash(options) }
2835
end
2936

@@ -56,6 +63,14 @@ def include_meta(json)
5663
end
5764

5865
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+
5974
cache_check(serializer) do
6075
serializer.attributes(options[:fields])
6176
end

lib/active_model/serializer/adapter/cached_serializer.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,34 @@ def object_cache_key
3939
object_time_safe = object_time_safe.strftime('%Y%m%d%H%M%S%9N') if object_time_safe.respond_to?(:strftime)
4040
(@klass._cache_key) ? "#{@klass._cache_key}/#{@cached_serializer.object.id}-#{object_time_safe}" : @cached_serializer.object.cache_key
4141
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
4270
end
4371
end
4472
end

test/serializers/cache_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,18 @@ def test_cache_digest_definition
149149
assert_equal(::Model::FILE_DIGEST, @post_serializer.class._cache_digest)
150150
end
151151

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+
152164
def test_serializer_file_path_on_nix
153165
path = '/Users/git/emberjs/ember-crm-backend/app/serializers/lead_serializer.rb'
154166
caller_line = "#{path}:1:in `<top (required)>'"

0 commit comments

Comments
 (0)