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 ‘key` option to the `cache` declaration 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 |