mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
Prefer object.cache_key when available.
This commit is contained in:
@@ -58,10 +58,6 @@ 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.
|
||||
@@ -146,18 +142,6 @@ module ActiveModel
|
||||
(_cache_only && !_cache_except || !_cache_only && _cache_except)
|
||||
end
|
||||
end
|
||||
|
||||
# Use object's cache_key if available, else derive a key from the object
|
||||
# Pass the `key` option to the `cache` declaration or override this method to customize the cache key
|
||||
def cache_key
|
||||
if object.respond_to?(:cache_key)
|
||||
object.cache_key
|
||||
else
|
||||
object_time_safe = object.updated_at
|
||||
object_time_safe = object_time_safe.strftime('%Y%m%d%H%M%S%9N') if object_time_safe.respond_to?(:strftime)
|
||||
"#{self.class._cache_key}/#{object.id}-#{object_time_safe}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -8,10 +8,6 @@ module ActiveModelSerializers
|
||||
ActiveModelSerializers::Adapter.register(subclass)
|
||||
end
|
||||
|
||||
def self.name
|
||||
to_s.demodulize
|
||||
end
|
||||
|
||||
attr_reader :serializer, :instance_options
|
||||
|
||||
def initialize(serializer, options = {})
|
||||
@@ -19,10 +15,6 @@ module ActiveModelSerializers
|
||||
@instance_options = options
|
||||
end
|
||||
|
||||
def name
|
||||
self.class.name
|
||||
end
|
||||
|
||||
def serializable_hash(_options = nil)
|
||||
fail NotImplementedError, 'This is an abstract method. Should be implemented at the concrete adapter.'
|
||||
end
|
||||
|
||||
@@ -4,13 +4,12 @@ module ActiveModelSerializers
|
||||
|
||||
def initialize(serializer)
|
||||
@cached_serializer = serializer
|
||||
return unless cached? && !@cached_serializer.object.respond_to?(:cache_key) && @klass._cache_key.blank?
|
||||
fail(UndefinedCacheKey, "#{@cached_serializer.object} must define #cache_key, or the cache_key option must be passed into cache on #{@cached_serializer}")
|
||||
@klass = @cached_serializer.class
|
||||
end
|
||||
|
||||
def cache_check(adapter_instance)
|
||||
if cached?
|
||||
@klass._cache.fetch(cache_key(adapter_instance), @klass._cache_options) do
|
||||
@klass._cache.fetch(cache_key, @klass._cache_options) do
|
||||
yield
|
||||
end
|
||||
elsif fragment_cached?
|
||||
@@ -28,16 +27,29 @@ module ActiveModelSerializers
|
||||
@klass.fragment_cache_enabled?
|
||||
end
|
||||
|
||||
def cache_key(adapter_instance)
|
||||
def cache_key
|
||||
return @cache_key if defined?(@cache_key)
|
||||
|
||||
parts = []
|
||||
parts << @cached_serializer.cache_key
|
||||
parts << adapter_instance.name.underscore
|
||||
parts << @klass._cache_digest unless @klass._skip_digest?
|
||||
parts << object_cache_key
|
||||
parts << @klass._cache_digest unless @klass._cache_options && @klass._cache_options[:skip_digest]
|
||||
@cache_key = parts.join('/')
|
||||
end
|
||||
|
||||
# Use object's cache_key if available, else derive a key from the object
|
||||
# Pass the `key` option to the `cache` declaration or override this method to customize the cache key
|
||||
def object_cache_key
|
||||
if @cached_serializer.object.respond_to?(:cache_key)
|
||||
@cached_serializer.object.cache_key
|
||||
elsif (cache_key = (@klass._cache_key || @klass._cache_options[:key]))
|
||||
object_time_safe = @cached_serializer.object.updated_at
|
||||
object_time_safe = object_time_safe.strftime('%Y%m%d%H%M%S%9N') if object_time_safe.respond_to?(:strftime)
|
||||
"#{cache_key}/#{@cached_serializer.object.id}-#{object_time_safe}"
|
||||
else
|
||||
fail UndefinedCacheKey, "#{@cached_serializer.object.class} must define #cache_key, or the 'key:' option must be passed into '#{@klass}.cache'"
|
||||
end
|
||||
end
|
||||
|
||||
# find all cache_key for the collection_serializer
|
||||
# @param collection_serializer
|
||||
# @param include_tree
|
||||
|
||||
Reference in New Issue
Block a user