mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 15:23:06 +00:00
Refactor fragment cache logic some more
This commit is contained in:
@@ -63,6 +63,14 @@ module ActiveModel
|
|||||||
_cache_options && _cache_options[:skip_digest]
|
_cache_options && _cache_options[:skip_digest]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cached_attributes
|
||||||
|
_cache_only ? _cache_only : _attributes - _cache_except
|
||||||
|
end
|
||||||
|
|
||||||
|
def non_cached_attributes
|
||||||
|
_attributes - cached_attributes
|
||||||
|
end
|
||||||
|
|
||||||
# @api private
|
# @api private
|
||||||
# Used by FragmentCache on the CachedSerializer
|
# Used by FragmentCache on the CachedSerializer
|
||||||
# to call attribute methods on the fragmented cached serializer.
|
# to call attribute methods on the fragmented cached serializer.
|
||||||
@@ -245,33 +253,14 @@ module ActiveModel
|
|||||||
self.class._cache_options ||= {}
|
self.class._cache_options ||= {}
|
||||||
self.class._cache_options[:key] = self.class._cache_key if self.class._cache_key
|
self.class._cache_options[:key] = self.class._cache_key if self.class._cache_key
|
||||||
|
|
||||||
attributes = self.class._attributes
|
cached_serializer = _get_or_create_fragment_cached_serializer(serializer_class_name)
|
||||||
cache_only = self.class._cache_only
|
|
||||||
cached_attributes = cache_only ? cache_only : attributes - self.class._cache_except
|
|
||||||
non_cached_attributes = attributes - cached_attributes
|
|
||||||
attributes_keys = self.class._attributes_keys
|
|
||||||
|
|
||||||
cached_serializer = _get_or_create_fragment_serializer "Cached#{serializer_class_name}"
|
|
||||||
cached_serializer.cache(self.class._cache_options)
|
|
||||||
cached_serializer.type(self.class._type)
|
|
||||||
cached_serializer.fragmented(self)
|
|
||||||
cached_attributes.each do |attribute|
|
|
||||||
options = attributes_keys[attribute] || {}
|
|
||||||
cached_serializer.attribute(attribute, options)
|
|
||||||
end
|
|
||||||
cached_hash = ActiveModelSerializers::SerializableResource.new(
|
cached_hash = ActiveModelSerializers::SerializableResource.new(
|
||||||
object,
|
object,
|
||||||
serializer: cached_serializer,
|
serializer: cached_serializer,
|
||||||
adapter: adapter_instance.class
|
adapter: adapter_instance.class
|
||||||
).serializable_hash
|
).serializable_hash
|
||||||
|
|
||||||
non_cached_serializer = _get_or_create_fragment_serializer "NonCached#{serializer_class_name}"
|
non_cached_serializer = _get_or_create_fragment_non_cached_serializer(serializer_class_name)
|
||||||
non_cached_serializer.type(self.class._type)
|
|
||||||
non_cached_serializer.fragmented(self)
|
|
||||||
non_cached_attributes.each do |attribute|
|
|
||||||
options = attributes_keys[attribute] || {}
|
|
||||||
non_cached_serializer.attribute(attribute, options)
|
|
||||||
end
|
|
||||||
non_cached_hash = ActiveModelSerializers::SerializableResource.new(
|
non_cached_hash = ActiveModelSerializers::SerializableResource.new(
|
||||||
object,
|
object,
|
||||||
serializer: non_cached_serializer,
|
serializer: non_cached_serializer,
|
||||||
@@ -282,6 +271,29 @@ module ActiveModel
|
|||||||
adapter_instance.fragment_cache(cached_hash, non_cached_hash)
|
adapter_instance.fragment_cache(cached_hash, non_cached_hash)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def _get_or_create_fragment_cached_serializer(serializer_class_name)
|
||||||
|
cached_serializer = _get_or_create_fragment_serializer "Cached#{serializer_class_name}"
|
||||||
|
cached_serializer.cache(self.class._cache_options)
|
||||||
|
cached_serializer.type(self.class._type)
|
||||||
|
cached_serializer.fragmented(self)
|
||||||
|
self.class.cached_attributes.each do |attribute|
|
||||||
|
options = self.class._attributes_keys[attribute] || {}
|
||||||
|
cached_serializer.attribute(attribute, options)
|
||||||
|
end
|
||||||
|
cached_serializer
|
||||||
|
end
|
||||||
|
|
||||||
|
def _get_or_create_fragment_non_cached_serializer(serializer_class_name)
|
||||||
|
non_cached_serializer = _get_or_create_fragment_serializer "NonCached#{serializer_class_name}"
|
||||||
|
non_cached_serializer.type(self.class._type)
|
||||||
|
non_cached_serializer.fragmented(self)
|
||||||
|
self.class.non_cached_attributes.each do |attribute|
|
||||||
|
options = self.class._attributes_keys[attribute] || {}
|
||||||
|
non_cached_serializer.attribute(attribute, options)
|
||||||
|
end
|
||||||
|
non_cached_serializer
|
||||||
|
end
|
||||||
|
|
||||||
def _get_or_create_fragment_serializer(name)
|
def _get_or_create_fragment_serializer(name)
|
||||||
return Object.const_get(name) if Object.const_defined?(name)
|
return Object.const_get(name) if Object.const_defined?(name)
|
||||||
Object.const_set(name, Class.new(ActiveModel::Serializer))
|
Object.const_set(name, Class.new(ActiveModel::Serializer))
|
||||||
|
|||||||
Reference in New Issue
Block a user