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
-
#cache_key(adapter_instance) ⇒ Object
rubocop:enable Metrics/AbcSize.
- #expand_cache_key(parts) ⇒ Object
- #fetch(adapter_instance, cache_options = serializer_class._cache_options) ⇒ Object
-
#fetch_attributes(fields, cached_attributes, adapter_instance) ⇒ Object
INSTANCE METHODS.
-
#fetch_attributes_fragment(adapter_instance, cached_attributes = {}) ⇒ Object
1.
-
#object_cache_key ⇒ Object
Use object’s cache_key if available, else derive a key from the object Pass the
keyoption to thecachedeclaration or override this method to customize the cache key. - #serializer_class ⇒ Object
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 = (parts) end |
#expand_cache_key(parts) ⇒ Object
269 270 271 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 269 def (parts) ActiveSupport::Cache.(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, = serializer_class.) if serializer_class.cache_store serializer_class.cache_store.fetch(cache_key(adapter_instance), ) 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.) 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
-
Determine cached fields from serializer class options
-
Get non_cached_fields and fetch cache_fields
-
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. ||= {} serializer_class.[: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.) 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_key ⇒ Object
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.[: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_class ⇒ Object
287 288 289 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 287 def serializer_class @serializer_class ||= self.class end |