class Object
Public Instance Methods
_cache_key_fetch_multi(key, options)
click to toggle source
Implementing our own version of _cache_key because jbuilder's is protected
# File lib/jbuilder_cache_multi/jbuilder_ext.rb, line 46 def _cache_key_fetch_multi(key, options) key = _fragment_name_with_digest_fetch_multi(key, options) key = url_for(key).split('://', 2).last if ::Hash === key ::ActiveSupport::Cache.expand_cache_key(key, :jbuilder) end
_fragment_name_with_digest_fetch_multi(key, options)
click to toggle source
# File lib/jbuilder_cache_multi/jbuilder_ext.rb, line 52 def _fragment_name_with_digest_fetch_multi(key, options) if @context.respond_to?(:cache_fragment_name) # Current compatibility, fragment_name_with_digest is private again and cache_fragment_name # should be used instead. @context.cache_fragment_name(key, options.slice(:skip_digest, :virtual_path)) elsif @context.respond_to?(:fragment_name_with_digest) # Backwards compatibility for period of time when fragment_name_with_digest was made public. @context.fragment_name_with_digest(key) else key end end
_keys_to_collection_map(collection, options)
click to toggle source
# File lib/jbuilder_cache_multi/jbuilder_ext.rb, line 65 def _keys_to_collection_map(collection, options) key = options.delete(:key) collection.inject({}) do |result, item| cache_key = if key.respond_to?(:call) key.call(item) elsif key [key, item] else item end result[_cache_key_fetch_multi(cache_key, options)] = item result end end
_process_collection_results(results)
click to toggle source
# File lib/jbuilder_cache_multi/jbuilder_ext.rb, line 82 def _process_collection_results(results) _results = results.class == Hash ? results.values : results #support pre 2.0 versions of jbuilder where merge! is still private if Jbuilder.instance_methods.include? :merge! merge! _results elsif Jbuilder.private_instance_methods.include? :_merge _merge _results else _results end end
cache_collection!(collection, options = {}) { |keys_to_collection_map| ... }
click to toggle source
Caches a collection of objects using fetch_multi, if supported. Requires a block for each item in the array. Accepts optional 'key' attribute in options (e.g. key: 'v1').
Example:
json.cache_collection! @people, expires_in: 10.minutes do |person|
json.partial! 'person', :person => person
end
# File lib/jbuilder_cache_multi/jbuilder_ext.rb, line 10 def cache_collection!(collection, options = {}, &block) if @context.controller.perform_caching && !collection.empty? keys_to_collection_map = _keys_to_collection_map(collection, options) if ::Rails.cache.respond_to?(:fetch_multi) results = ::Rails.cache.fetch_multi(*keys_to_collection_map.keys, options) do |key| _scope { yield keys_to_collection_map[key] } end else results = keys_to_collection_map.map do |key, item| ::Rails.cache.fetch(key, options) { _scope { yield item } } end end _process_collection_results(results) else array! collection, options, &block end end
cache_collection_if!(condition, collection, options = {}, &block)
click to toggle source
Conditionally caches a collection of objects depending in the condition given as first parameter.
Example:
json.cache_collection_if! do_cache?, @people, expires_in: 10.minutes do |person|
json.partial! 'person', :person => person
end
# File lib/jbuilder_cache_multi/jbuilder_ext.rb, line 37 def cache_collection_if!(condition, collection, options = {}, &block) condition ? cache_collection!(collection, options, &block) : array!(collection, options, &block) end