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
77 78 79 80 81 82 83 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 77 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
50 51 52 53 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 50 def _cache_digest return @_cache_digest if defined?(@_cache_digest) @_cache_digest = digest_caller_file(_cache_digest_file_path) end |
#_skip_digest? ⇒ Boolean
69 70 71 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 69 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
119 120 121 122 123 124 125 126 127 128 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 119 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
164 165 166 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 164 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
176 177 178 179 180 181 182 183 184 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 176 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.
154 155 156 157 158 159 160 161 162 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 154 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
56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 56 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
168 169 170 171 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 168 def fragment_cache_enabled? perform_caching? && cache_store && (_cache_only && !_cache_except || !_cache_only && _cache_except) end |
#fragmented_attributes ⇒ Object
85 86 87 88 89 90 91 92 93 94 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 85 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
44 45 46 47 48 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 44 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.
214 215 216 217 218 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 214 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
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 191 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
137 138 139 140 |
# File 'lib/active_model/serializer/concerns/caching.rb', line 137 def perform_caching return @@perform_caching if defined?(@@perform_caching) && !@@perform_caching.nil? @@perform_caching = ActiveModelSerializers.config.perform_caching end |