method
cache_collection_render
v8.1.1 -
Show latest stable
- Class:
ActionView::CollectionCaching
cache_collection_render(instrumentation_payload, view, template, collection)private
No documentation available.
# File actionview/lib/action_view/renderer/partial_renderer/collection_caching.rb, line 20
def cache_collection_render(instrumentation_payload, view, template, collection)
return yield(collection) unless will_cache?(@options, view)
collection_iterator = collection
# Result is a hash with the key represents the
# key used for cache lookup and the value is the item
# on which the partial is being rendered
keyed_collection, ordered_keys = collection_by_cache_keys(view, template, collection)
# Pull all partials from cache
# Result is a hash, key matches the entry in
# `keyed_collection` where the cache was retrieved and the
# value is the value that was present in the cache
cached_partials = collection_cache.read_multi(*keyed_collection.keys)
instrumentation_payload[:cache_hits] = cached_partials.size
# Extract the items for the keys that are not found
collection = keyed_collection.reject { |key, _| cached_partials.key?(key) }.values
rendered_partials = collection.empty? ? [] : yield(collection_iterator.from_collection(collection))
index = 0
keyed_partials = fetch_or_cache_partial(cached_partials, template, order_by: keyed_collection.each_key) do
# This block is called once
# for every cache miss while preserving order.
rendered_partials[index].tap { index += 1 }
end
ordered_keys.map do |key|
keyed_partials[key]
end
end