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

rubocop:enable Metrics/AbcSize



259
260
261
262
263
264
265
266
267
# File 'lib/active_model/serializer/concerns/caching.rb', line 259

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



269
270
271
# File 'lib/active_model/serializer/concerns/caching.rb', line 269

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

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



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

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

#fetch_attributes(fields, cached_attributes, adapter_instance) ⇒ Object

INSTANCE METHODS



205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/active_model/serializer/concerns/caching.rb', line 205

def fetch_attributes(fields, cached_attributes, adapter_instance)
  if serializer_class.cache_enabled?
    key = cache_key(adapter_instance)
    cached_attributes.fetch(key) do
      serializer_class.cache_store.fetch(key, serializer_class._cache_options) do
        attributes(fields, true)
      end
    end
  elsif serializer_class.fragment_cache_enabled?
    fetch_attributes_fragment(adapter_instance, cached_attributes)
  else
    attributes(fields, true)
  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

rubocop:disable Metrics/AbcSize



234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/active_model/serializer/concerns/caching.rb', line 234

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! resource_relationships({}, { include_directive: include_directive }, adapter_instance)

  cached_fields = fields[:cached].dup
  key = cache_key(adapter_instance)
  cached_hash =
    cached_attributes.fetch(key) do
      serializer_class.cache_store.fetch(key, serializer_class._cache_options) do
        hash = attributes(cached_fields, true)
        include_directive = JSONAPI::IncludeDirective.new(cached_fields - hash.keys)
        hash.merge! resource_relationships({}, { 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



275
276
277
278
279
280
281
282
283
284
285
# File 'lib/active_model/serializer/concerns/caching.rb', line 275

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



287
288
289
# File 'lib/active_model/serializer/concerns/caching.rb', line 287

def serializer_class
  @serializer_class ||= self.class
end