Provide convenience serializer_class for all the self.class calls

per groyoh
https://github.com/rails-api/active_model_serializers/pull/1781#discussion_r66021340
This commit is contained in:
Benjamin Fleischer 2016-06-07 20:28:02 -05:00
parent 5375e009e2
commit b599360ae3

View File

@ -18,7 +18,7 @@ module ActiveModel
# race_condition_ttl
# Passed to ::_cache as
# serializer.cache_store.fetch(cache_key, @klass._cache_options)
# Passed as second argument to serializer.cache_store.fetch(cache_key, self.class._cache_options)
# Passed as second argument to serializer.cache_store.fetch(cache_key, serializer_class._cache_options)
serializer.class_attribute :_cache_digest_file_path # @api private : Derived at inheritance
end
end
@ -203,23 +203,23 @@ module ActiveModel
### INSTANCE METHODS
def fetch_attributes(fields, cached_attributes, adapter_instance)
if self.class.cache_enabled?
if serializer_class.cache_enabled?
key = cache_key(adapter_instance)
cached_attributes.fetch(key) do
self.class.cache_store.fetch(key, self.class._cache_options) do
serializer_class.cache_store.fetch(key, serializer_class._cache_options) do
attributes(fields, true)
end
end
elsif self.class.fragment_cache_enabled?
elsif serializer_class.fragment_cache_enabled?
fetch_attributes_fragment(adapter_instance)
else
attributes(fields, true)
end
end
def fetch(adapter_instance, cache_options = self.class._cache_options)
if self.class.cache_store
self.class.cache_store.fetch(cache_key(adapter_instance), cache_options) do
def fetch(adapter_instance, cache_options = serializer_class._cache_options)
if serializer_class.cache_store
serializer_class.cache_store.fetch(cache_key(adapter_instance), cache_options) do
yield
end
else
@ -231,9 +231,9 @@ module ActiveModel
# 2. Get non_cached_fields and fetch cache_fields
# 3. Merge the two hashes using adapter_instance#fragment_cache
def fetch_attributes_fragment(adapter_instance)
self.class._cache_options ||= {}
self.class._cache_options[:key] = self.class._cache_key if self.class._cache_key
fields = self.class.fragmented_attributes
serializer_class._cache_options ||= {}
serializer_class._cache_options[:key] = serializer_class._cache_key if serializer_class._cache_key
fields = serializer_class.fragmented_attributes
non_cached_fields = fields[:non_cached].dup
non_cached_hash = attributes(non_cached_fields, true)
@ -243,7 +243,7 @@ module ActiveModel
cached_fields = fields[:cached].dup
key = cache_key(adapter_instance)
cached_hash =
self.class.cache_store.fetch(key, self.class._cache_options) do
serializer_class.cache_store.fetch(key, serializer_class._cache_options) do
hash = attributes(cached_fields, true)
include_directive = JSONAPI::IncludeDirective.new(cached_fields - hash.keys)
hash.merge! resource_relationships({}, { include_directive: include_directive }, adapter_instance)
@ -259,7 +259,7 @@ module ActiveModel
parts = []
parts << object_cache_key
parts << adapter_instance.cache_key
parts << self.class._cache_digest unless self.class._skip_digest?
parts << serializer_class._cache_digest unless serializer_class._skip_digest?
@cache_key = parts.join('/')
end
@ -268,14 +268,18 @@ module ActiveModel
def object_cache_key
if object.respond_to?(:cache_key)
object.cache_key
elsif (serializer_cache_key = (self.class._cache_key || self.class._cache_options[:key]))
elsif (serializer_cache_key = (serializer_class._cache_key || serializer_class._cache_options[:key]))
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)
"#{serializer_cache_key}/#{object.id}-#{object_time_safe}"
else
fail UndefinedCacheKey, "#{object.class} must define #cache_key, or the 'key:' option must be passed into '#{self.class}.cache'"
fail UndefinedCacheKey, "#{object.class} must define #cache_key, or the 'key:' option must be passed into '#{serializer_class}.cache'"
end
end
def serializer_class
@serializer_class ||= self.class
end
end
end
end