mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
Include adapter in cache key
Confirm caching attributes with different key json_api vs. attributes adapter Adapted from @kevintyll's original test https://github.com/rails-api/active_model_serializers/pull/1644#issuecomment-204147094
This commit is contained in:
committed by
Benjamin Fleischer
parent
e118599052
commit
16a3f93ce9
@@ -58,6 +58,10 @@ module ActiveModel
|
||||
''.freeze
|
||||
end
|
||||
|
||||
def _skip_digest?
|
||||
_cache_options && _cache_options[:skip_digest]
|
||||
end
|
||||
|
||||
# @api private
|
||||
# Used by FragmentCache on the CachedSerializer
|
||||
# to call attribute methods on the fragmented cached serializer.
|
||||
|
||||
@@ -30,7 +30,7 @@ module ActiveModelSerializers
|
||||
def cache_read_multi
|
||||
return {} if ActiveModelSerializers.config.cache_store.blank?
|
||||
|
||||
keys = CachedSerializer.object_cache_keys(serializer, @include_tree)
|
||||
keys = CachedSerializer.object_cache_keys(serializer, self, @include_tree)
|
||||
|
||||
return {} if keys.blank?
|
||||
|
||||
@@ -49,7 +49,7 @@ module ActiveModelSerializers
|
||||
def cached_attributes(cached_serializer)
|
||||
return yield unless cached_serializer.cached?
|
||||
|
||||
@cached_attributes.fetch(cached_serializer.cache_key) { yield }
|
||||
@cached_attributes.fetch(cached_serializer.cache_key(self)) { yield }
|
||||
end
|
||||
|
||||
def serializable_hash_for_single_resource(options)
|
||||
|
||||
@@ -15,6 +15,10 @@ module ActiveModelSerializers
|
||||
@instance_options = options
|
||||
end
|
||||
|
||||
def cached_name
|
||||
@cached_name ||= self.class.name.demodulize.underscore
|
||||
end
|
||||
|
||||
def serializable_hash(_options = nil)
|
||||
fail NotImplementedError, 'This is an abstract method. Should be implemented at the concrete adapter.'
|
||||
end
|
||||
|
||||
@@ -9,7 +9,7 @@ module ActiveModelSerializers
|
||||
|
||||
def cache_check(adapter_instance)
|
||||
if cached?
|
||||
@klass._cache.fetch(cache_key, @klass._cache_options) do
|
||||
@klass._cache.fetch(cache_key(adapter_instance), @klass._cache_options) do
|
||||
yield
|
||||
end
|
||||
elsif fragment_cached?
|
||||
@@ -27,12 +27,13 @@ module ActiveModelSerializers
|
||||
@klass.fragment_cache_enabled?
|
||||
end
|
||||
|
||||
def cache_key
|
||||
def cache_key(adapter_instance)
|
||||
return @cache_key if defined?(@cache_key)
|
||||
|
||||
parts = []
|
||||
parts << object_cache_key
|
||||
parts << @klass._cache_digest unless @klass._cache_options && @klass._cache_options[:skip_digest]
|
||||
parts << adapter_instance.cached_name
|
||||
parts << @klass._cache_digest unless @klass._skip_digest?
|
||||
@cache_key = parts.join('/')
|
||||
end
|
||||
|
||||
@@ -54,19 +55,19 @@ module ActiveModelSerializers
|
||||
# @param collection_serializer
|
||||
# @param include_tree
|
||||
# @return [Array] all cache_key of collection_serializer
|
||||
def self.object_cache_keys(serializers, include_tree)
|
||||
def self.object_cache_keys(serializers, adapter_instance, include_tree)
|
||||
cache_keys = []
|
||||
|
||||
serializers.each do |serializer|
|
||||
cache_keys << object_cache_key(serializer)
|
||||
cache_keys << object_cache_key(serializer, adapter_instance)
|
||||
|
||||
serializer.associations(include_tree).each do |association|
|
||||
if association.serializer.respond_to?(:each)
|
||||
association.serializer.each do |sub_serializer|
|
||||
cache_keys << object_cache_key(sub_serializer)
|
||||
cache_keys << object_cache_key(sub_serializer, adapter_instance)
|
||||
end
|
||||
else
|
||||
cache_keys << object_cache_key(association.serializer)
|
||||
cache_keys << object_cache_key(association.serializer, adapter_instance)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -75,11 +76,11 @@ module ActiveModelSerializers
|
||||
end
|
||||
|
||||
# @return [String, nil] the cache_key of the serializer or nil
|
||||
def self.object_cache_key(serializer)
|
||||
def self.object_cache_key(serializer, adapter_instance)
|
||||
return unless serializer.present? && serializer.object.present?
|
||||
|
||||
cached_serializer = new(serializer)
|
||||
cached_serializer.cached? ? cached_serializer.cache_key : nil
|
||||
cached_serializer.cached? ? cached_serializer.cache_key(adapter_instance) : nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user