Class: ActiveModelSerializers::CachedSerializer

Inherits:
Object
  • Object
show all
Defined in:
lib/active_model_serializers/cached_serializer.rb

Constant Summary

UndefinedCacheKey =
Class.new(StandardError)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (CachedSerializer) initialize(serializer)

Returns a new instance of CachedSerializer



5
6
7
8
# File 'lib/active_model_serializers/cached_serializer.rb', line 5

def initialize(serializer)
  @cached_serializer = serializer
  @klass             = @cached_serializer.class
end

Class Method Details

+ (String?) object_cache_key(serializer, adapter_instance)

Returns the cache_key of the serializer or nil

Returns:

  • (String, nil)

    the cache_key of the serializer or nil



80
81
82
83
84
85
# File 'lib/active_model_serializers/cached_serializer.rb', line 80

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(adapter_instance) : nil
end

+ (Array) object_cache_keys(serializers, adapter_instance, include_tree)

find all cache_key for the collection_serializer

Parameters:

Returns:

  • (Array)

    all cache_key of collection_serializer



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/active_model_serializers/cached_serializer.rb', line 59

def self.object_cache_keys(serializers, adapter_instance, include_tree)
  cache_keys = []

  serializers.each do |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, adapter_instance)
        end
      else
        cache_keys << object_cache_key(association.serializer, adapter_instance)
      end
    end
  end

  cache_keys.compact.uniq
end

Instance Method Details

- (Object) cache_check(adapter_instance)



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/active_model_serializers/cached_serializer.rb', line 10

def cache_check(adapter_instance)
  if cached?
    @klass._cache.fetch(cache_key(adapter_instance), @klass._cache_options) do
      yield
    end
  elsif fragment_cached?
    FragmentCache.new(adapter_instance, @cached_serializer, adapter_instance.instance_options).fetch
  else
    yield
  end
end

- (Object) cache_key(adapter_instance)



30
31
32
33
34
35
36
37
38
# File 'lib/active_model_serializers/cached_serializer.rb', line 30

def cache_key(adapter_instance)
  return @cache_key if defined?(@cache_key)

  parts = []
  parts << object_cache_key
  parts << adapter_instance.cached_name
  parts << @klass._cache_digest unless @klass._skip_digest?
  @cache_key = parts.join('/')
end

- (Boolean) cached?

Returns:

  • (Boolean)


22
23
24
# File 'lib/active_model_serializers/cached_serializer.rb', line 22

def cached?
  @klass.cache_enabled?
end

- (Boolean) fragment_cached?

Returns:

  • (Boolean)


26
27
28
# File 'lib/active_model_serializers/cached_serializer.rb', line 26

def fragment_cached?
  @klass.fragment_cache_enabled?
end

- (Object) object_cache_key

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



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/active_model_serializers/cached_serializer.rb', line 42

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