Module: ActiveModel::Serializer::Caching

Extended by:
ActiveSupport::Concern
Included in:
ActiveModel::Serializer
Defined in:
lib/active_model/serializer/concerns/caching.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

CALLER_FILE =

Matches

"c:/git/emberjs/ember-crm-backend/app/serializers/lead_serializer.rb:1:in `<top (required)>'"
AND
"/c/git/emberjs/ember-crm-backend/app/serializers/lead_serializer.rb:1:in `<top (required)>'"
AS
c/git/emberjs/ember-crm-backend/app/serializers/lead_serializer.rb
/
  \A       # start of string
  .+       # file path (one or more characters)
  (?=      # stop previous match when
    :\d+     # a colon is followed by one or more digits
    :in      # followed by a colon followed by in
  )
/x

Instance Method Summary collapse

Instance Method Details

#cache_key(adapter_instance) ⇒ Object



267
268
269
270
271
272
273
274
275
# File 'lib/active_model/serializer/concerns/caching.rb', line 267

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

  parts = []
  parts << object_cache_key
  parts << adapter_instance.cache_key
  parts << serializer_class._cache_digest unless serializer_class._skip_digest?
  @cache_key = expand_cache_key(parts)
end

#expand_cache_key(parts) ⇒ Object



277
278
279
# File 'lib/active_model/serializer/concerns/caching.rb', line 277

def expand_cache_key(parts)
  ActiveSupport::Cache.expand_cache_key(parts)
end

#fetch(adapter_instance, cache_options = serializer_class._cache_options, key = nil) ⇒ Object



229
230
231
232
233
234
235
236
237
238
# File 'lib/active_model/serializer/concerns/caching.rb', line 229

def fetch(adapter_instance, cache_options = serializer_class._cache_options, key = nil)
  if serializer_class.cache_store
    key ||= cache_key(adapter_instance)
    serializer_class.cache_store.fetch(key, cache_options) do
      yield
    end
  else
    yield
  end
end

#fetch_attributes(fields, cached_attributes, adapter_instance) ⇒ Object

INSTANCE METHODS



220
221
222
223
224
225
226
227
# File 'lib/active_model/serializer/concerns/caching.rb', line 220

def fetch_attributes(fields, cached_attributes, adapter_instance)
  key = cache_key(adapter_instance)
  cached_attributes.fetch(key) do
    fetch(adapter_instance, serializer_class._cache_options, key) do
      attributes(fields, true)
    end
  end
end

#fetch_attributes_fragment(adapter_instance, cached_attributes = {}) ⇒ Object

  1. Determine cached fields from serializer class options

  2. Get non_cached_fields and fetch cache_fields

  3. Merge the two hashes using adapter_instance#fragment_cache



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/active_model/serializer/concerns/caching.rb', line 243

def fetch_attributes_fragment(adapter_instance, cached_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)
  include_directive = JSONAPI::IncludeDirective.new(non_cached_fields - non_cached_hash.keys)
  non_cached_hash.merge! associations_hash({}, { include_directive: include_directive }, adapter_instance)

  cached_fields = fields[:cached].dup
  key = cache_key(adapter_instance)
  cached_hash =
    cached_attributes.fetch(key) do
      fetch(adapter_instance, serializer_class._cache_options, key) do
        hash = attributes(cached_fields, true)
        include_directive = JSONAPI::IncludeDirective.new(cached_fields - hash.keys)
        hash.merge! associations_hash({}, { include_directive: include_directive }, adapter_instance)
      end
    end
  # Merge both results
  adapter_instance.fragment_cache(cached_hash, non_cached_hash)
end

#object_cache_keyObject

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



283
284
285
286
287
288
289
290
291
292
293
# File 'lib/active_model/serializer/concerns/caching.rb', line 283

def object_cache_key
  if object.respond_to?(:cache_key)
    object.cache_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 '#{serializer_class}.cache'"
  end
end

#serializer_classObject



295
296
297
# File 'lib/active_model/serializer/concerns/caching.rb', line 295

def serializer_class
  @serializer_class ||= self.class
end