class JSONAPI::Renderer::CachedResourcesProcessor

@private

Public Class Methods

new(cache) click to toggle source
# File lib/jsonapi/renderer/cached_resources_processor.rb, line 13
def initialize(cache)
  @cache = cache
end

Public Instance Methods

cache_key_map(resources) click to toggle source
# File lib/jsonapi/renderer/cached_resources_processor.rb, line 36
def cache_key_map(resources)
  resources.each_with_object({}) do |res, h|
    ri = [res.jsonapi_type, res.jsonapi_id]
    include_dir = @include_rels[ri]
    fields = @fields[ri.first.to_sym]
    h[res.jsonapi_cache_key(include: include_dir, fields: fields)] =
      [res, include_dir, fields]
  end
end
process_resources() click to toggle source
# File lib/jsonapi/renderer/cached_resources_processor.rb, line 17
def process_resources
  # NOTE(beauby): This is necessary for cache keys consistency.
  @include_rels = @include_rels.each_with_object({}) do |(k, v), h|
    h[k] = v.to_a.sort!
  end

  [@primary, @included].each do |resources|
    cache_hash = cache_key_map(resources)
    processed_resources = @cache.fetch_multi(*cache_hash.keys) do |key|
      res, include, fields = cache_hash[key]
      json = res.as_jsonapi(include: include, fields: fields).to_json

      JSONString.new(json)
    end

    resources.replace(processed_resources.values)
  end
end