module ActiveModel::Serializer::Caching::ClassMethods
def _attributes_keys
- See: Serializer::fragmented_attributes -
See: Serializer::attribute -
Other tags:
- Api: - private
def _attributes_keys _attributes_data .each_with_object({}) do |(key, attr), hash| next if key == attr.name hash[attr.name] = { key: key } end end
def _cache_digest
def _cache_digest return @_cache_digest if defined?(@_cache_digest) @_cache_digest = digest_caller_file(_cache_digest_file_path) end
def _skip_digest?
def _skip_digest? _cache_options && _cache_options[:skip_digest] end
def cache(options = {})
- Todo: - require less code comments. See
Parameters:
-
options
(Hash
) -- with valid keys:
def cache(options = {}) self._cache = options.delete(:cache_store) || ActiveModelSerializers.config.cache_store || ActiveSupport::Cache.lookup_store(:null_store) self._cache_key = options.delete(:key) self._cache_only = options.delete(:only) self._cache_except = options.delete(:except) self._cache_options = options.empty? ? nil : options end
def cache_enabled?
def cache_enabled? perform_caching? && cache_store && !_cache_only && !_cache_except end
def cache_read_multi(collection_serializer, adapter_instance, include_directive)
-
(Hash)
-
def cache_read_multi(collection_serializer, adapter_instance, include_directive) return {} if ActiveModelSerializers.config.cache_store.blank? keys = object_cache_keys(collection_serializer, adapter_instance, include_directive) return {} if keys.blank? ActiveModelSerializers.config.cache_store.read_multi(*keys) end
def cache_store
-
(nil)
- when _cache is the NullStore and ActiveModelSerializers.config.cache_store is nil. -
(ActiveModelSerializers.config.cache_store)
- when _cache is the NullStore. -
(._cache)
- when _cache is not the NullStore -
(nil)
- when _cache is not set (i.e. when `cache` has not been called)
def cache_store return nil if _cache.nil? return _cache if _cache.class != ActiveSupport::Cache::NullStore if ActiveModelSerializers.config.cache_store self._cache = ActiveModelSerializers.config.cache_store else nil end end
def digest_caller_file(caller_line)
def digest_caller_file(caller_line) serializer_file_path = caller_line[CALLER_FILE] serializer_file_contents = IO.read(serializer_file_path) Digest::MD5.hexdigest(serializer_file_contents) rescue TypeError, Errno::ENOENT warn <<-EOF.strip_heredoc Cannot digest non-existent file: '#{caller_line}'. Please set `::_cache_digest` of the serializer if you'd like to cache it. EOF ''.freeze end
def fragment_cache_enabled?
def fragment_cache_enabled? perform_caching? && cache_store && (_cache_only && !_cache_except || !_cache_only && _cache_except) end
def fragmented_attributes
def fragmented_attributes cached = _cache_only ? _cache_only : _attributes - _cache_except cached = cached.map! { |field| _attributes_keys.fetch(field, field) } non_cached = _attributes - cached non_cached = non_cached.map! { |field| _attributes_keys.fetch(field, field) } { cached: cached, non_cached: non_cached } end
def inherited(base)
def inherited(base) caller_line = caller[1] base._cache_digest_file_path = caller_line super end
def object_cache_key(serializer, adapter_instance)
-
(String, nil)
- the cache_key of the serializer or nil
def object_cache_key(serializer, adapter_instance) return unless serializer.present? && serializer.object.present? (serializer.class.cache_enabled? || serializer.class.fragment_cache_enabled?) ? serializer.cache_key(adapter_instance) : nil end
def object_cache_keys(collection_serializer, adapter_instance, include_directive)
-
(Array)
- all cache_key of collection_serializer
Parameters:
-
include_directive
(JSONAPI::IncludeDirective
) -- -
adapter_instance
(ActiveModelSerializers::Adapter::Base
) -- -
serializers
(ActiveModel::Serializer::CollectionSerializer
) --
def object_cache_keys(collection_serializer, adapter_instance, include_directive) cache_keys = [] collection_serializer.each do |serializer| cache_keys << object_cache_key(serializer, adapter_instance) serializer.associations(include_directive).each do |association| # TODO(BF): Process relationship without evaluating lazy_association association_serializer = association.lazy_association.serializer if association_serializer.respond_to?(:each) association_serializer.each do |sub_serializer| cache_keys << object_cache_key(sub_serializer, adapter_instance) end else cache_keys << object_cache_key(association_serializer, adapter_instance) end end end cache_keys.compact.uniq end
def perform_caching
-
(true, false)
-
def perform_caching return @@perform_caching if defined?(@@perform_caching) && !@@perform_caching.nil? @@perform_caching = ActiveModelSerializers.config.perform_caching end