Module: ActiveModel::Serializer::Caching::ClassMethods
- Defined in:
- lib/active_model/serializer/concerns/caching.rb
Instance Method Summary collapse
-
#_attributes_keys ⇒ Object
private
maps attribute value to explicit key name.
- #_cache_digest ⇒ Object
- #_skip_digest? ⇒ Boolean
-
#cache(options = {}) ⇒ Object
Enables a serializer to be automatically cached.
- #cache_enabled? ⇒ Boolean
-
#cache_read_multi(collection_serializer, adapter_instance, include_directive) ⇒ Hash
Read cache from cache_store Used in CollectionSerializer to set :cached_attributes.
-
#cache_store ⇒ nil, ...
The canonical method for getting the cache store for the serializer.
-
#digest_caller_file(caller_line) ⇒ Object
Hashes contents of file for
_cache_digest. - #fragment_cache_enabled? ⇒ Boolean
- #fragmented_attributes ⇒ Object
- #inherited(base) ⇒ Object
-
#object_cache_key(serializer, adapter_instance) ⇒ String?
The cache_key of the serializer or nil.
-
#object_cache_keys(collection_serializer, adapter_instance, include_directive) ⇒ Array
Find all cache_key for the collection_serializer.
-
#perform_caching ⇒ true, false
(also: #perform_caching?)
Value is from ActiveModelSerializers.config.perform_caching.
Instance Method Details
#_attributes_keys ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
maps attribute value to explicit key name
75 76 77 78 79 80 81 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 75 def _attributes_keys _attributes_data .each_with_object({}) do |(key, attr), hash| next if key == attr.name hash[attr.name] = { key: key } end end |
#_cache_digest ⇒ Object
48 49 50 51 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 48 def _cache_digest return @_cache_digest if defined?(@_cache_digest) @_cache_digest = digest_caller_file(_cache_digest_file_path) end |
#_skip_digest? ⇒ Boolean
67 68 69 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 67 def _skip_digest? && [:skip_digest] end |
#cache(options = {}) ⇒ Object
require less code comments. See
Enables a serializer to be automatically cached
Sets ::_cache object to ActionController::Base.cache_store
when Rails.configuration.action_controller.perform_caching
github.com/rails-api/active_model_serializers/pull/1249#issuecomment-146567837
117 118 119 120 121 122 123 124 125 126 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 117 def cache( = {}) self._cache = .delete(:cache_store) || ActiveModelSerializers.config.cache_store || ActiveSupport::Cache.lookup_store(:null_store) self._cache_key = .delete(:key) self._cache_only = .delete(:only) self._cache_except = .delete(:except) self. = .empty? ? nil : end |
#cache_enabled? ⇒ Boolean
162 163 164 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 162 def cache_enabled? perform_caching? && cache_store && !_cache_only && !_cache_except end |
#cache_read_multi(collection_serializer, adapter_instance, include_directive) ⇒ Hash
Read cache from cache_store Used in CollectionSerializer to set :cached_attributes
174 175 176 177 178 179 180 181 182 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 174 def cache_read_multi(collection_serializer, adapter_instance, include_directive) return {} if ActiveModelSerializers.config.cache_store.blank? keys = object_cache_keys(collection_serializer, adapter_instance, include_directive) return {} if keys.blank? ActiveModelSerializers.config.cache_store.read_multi(*keys) end |
#cache_store ⇒ nil, ...
The canonical method for getting the cache store for the serializer.
152 153 154 155 156 157 158 159 160 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 152 def cache_store return nil if _cache.nil? return _cache if _cache.class != ActiveSupport::Cache::NullStore if ActiveModelSerializers.config.cache_store self._cache = ActiveModelSerializers.config.cache_store else nil end end |
#digest_caller_file(caller_line) ⇒ Object
Hashes contents of file for _cache_digest
54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 54 def digest_caller_file(caller_line) serializer_file_path = caller_line[CALLER_FILE] serializer_file_contents = IO.read(serializer_file_path) Digest::MD5.hexdigest(serializer_file_contents) rescue TypeError, Errno::ENOENT warn <<-EOF.strip_heredoc Cannot digest non-existent file: '#{caller_line}'. Please set `::_cache_digest` of the serializer if you'd like to cache it. EOF ''.freeze end |
#fragment_cache_enabled? ⇒ Boolean
166 167 168 169 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 166 def fragment_cache_enabled? perform_caching? && cache_store && (_cache_only && !_cache_except || !_cache_only && _cache_except) end |
#fragmented_attributes ⇒ Object
83 84 85 86 87 88 89 90 91 92 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 83 def fragmented_attributes cached = _cache_only ? _cache_only : _attributes - _cache_except cached = cached.map! { |field| _attributes_keys.fetch(field, field) } non_cached = _attributes - cached non_cached = non_cached.map! { |field| _attributes_keys.fetch(field, field) } { cached: cached, non_cached: non_cached } end |
#inherited(base) ⇒ Object
42 43 44 45 46 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 42 def inherited(base) caller_line = caller[1] base._cache_digest_file_path = caller_line super end |
#object_cache_key(serializer, adapter_instance) ⇒ String?
Returns the cache_key of the serializer or nil.
212 213 214 215 216 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 212 def object_cache_key(serializer, adapter_instance) return unless serializer.present? && serializer.object.present? (serializer.class.cache_enabled? || serializer.class.fragment_cache_enabled?) ? serializer.cache_key(adapter_instance) : nil end |
#object_cache_keys(collection_serializer, adapter_instance, include_directive) ⇒ Array
Find all cache_key for the collection_serializer
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 189 def object_cache_keys(collection_serializer, adapter_instance, include_directive) cache_keys = [] collection_serializer.each do |serializer| cache_keys << object_cache_key(serializer, adapter_instance) serializer.associations(include_directive).each do |association| # TODO(BF): Process relationship without evaluating lazy_association association_serializer = association.lazy_association.serializer if association_serializer.respond_to?(:each) association_serializer.each do |sub_serializer| cache_keys << object_cache_key(sub_serializer, adapter_instance) end else cache_keys << object_cache_key(association_serializer, adapter_instance) end end end cache_keys.compact.uniq end |
#perform_caching ⇒ true, false Also known as: perform_caching?
Value is from ActiveModelSerializers.config.perform_caching. Is used to globally enable or disable all serializer caching, just like Rails.configuration.action_controller.perform_caching, which is its default value in a Rails application. Memoizes value of config first time it is called with a non-nil value. rubocop:disable Style/ClassVars
135 136 137 138 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 135 def perform_caching return @@perform_caching if defined?(@@perform_caching) && !@@perform_caching.nil? @@perform_caching = ActiveModelSerializers.config.perform_caching end |