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



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

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



279
280
281
# File 'lib/active_model/serializer/concerns/caching.rb', line 279

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

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



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

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



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

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



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

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



285
286
287
288
289
290
291
292
293
294
295
296
297
# File 'lib/active_model/serializer/concerns/caching.rb', line 285

def object_cache_key
  if object.respond_to?(:cache_key_with_version)
    object.cache_key_with_version
  elsif 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



299
300
301
# File 'lib/active_model/serializer/concerns/caching.rb', line 299

def serializer_class
  @serializer_class ||= self.class
end