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