class Rabl::MultiBuilder

Public Class Methods

new(data, settings = {}, options = {}) click to toggle source

Constructs a new MultiBuilder given the data and options. The options will be re-used for all Rabl::Builders. Rabl::MultiBuilder.new([#<User …>, #<User …>, …], { :format => ‘json’, :child_root => true })

# File lib/rabl/multi_builder.rb, line 8
def initialize(data, settings = {}, options = {})
  @data                 = data
  @settings             = settings
  @options              = options
  @builders             = []
  @engine_to_builder    = {}
  @cache_key_to_engine  = {}
end

Public Instance Methods

to_a() click to toggle source

Returns the result of all of the builders as an array

# File lib/rabl/multi_builder.rb, line 18
def to_a
  generate_builders

  if template_cache_configured? && Rabl.configuration.use_read_multi
    map_engines_to_builders
    read_cache_results
    replace_engines_with_cache_results
  end

  result = @builders.map(&:to_hash)
  result = result.map(&:presence).compact if Rabl.configuration.exclude_empty_values_in_collections
  result
end

Private Instance Methods

cache_key_for(engine) click to toggle source
# File lib/rabl/multi_builder.rb, line 71
def cache_key_for(engine)
  case engine
  when Hash
    cache_key_for(engine.values.first)
  when Engine
    engine.cache_key
  end
end
disable_cache_read_on_render(engine) click to toggle source
# File lib/rabl/multi_builder.rb, line 62
def disable_cache_read_on_render(engine)
  case engine
  when Hash
    disable_cache_read_on_render(engine.values.first)
  when Engine
    engine.cache_read_on_render = false
  end
end
generate_builders() click to toggle source

Creates a builder for each of the data objects and maps the cache keys for each of the engines the builders generated

# File lib/rabl/multi_builder.rb, line 37
def generate_builders
  @builders = @data.map do |object|
    Builder.new(object, @settings, @options)
  end
end
map_cache_key_to_engine(engine) click to toggle source

Maps a cache key to an engine

# File lib/rabl/multi_builder.rb, line 54
def map_cache_key_to_engine(engine)
  if cache_key = cache_key_for(engine)
    result_cache_key = ActiveSupport::Cache.expand_cache_key(cache_key, :rabl)
    @cache_key_to_engine[result_cache_key] = engine
    disable_cache_read_on_render(engine)
  end
end
map_engines_to_builders() click to toggle source
# File lib/rabl/multi_builder.rb, line 43
def map_engines_to_builders
  @builders.each do |builder|
    builder.engines.each do |engine|
      @engine_to_builder[engine] = builder

      map_cache_key_to_engine(engine)
    end
  end
end
read_cache_results() click to toggle source

Returns the items that were found in the cache

# File lib/rabl/multi_builder.rb, line 81
def read_cache_results
  @cache_results ||= begin
    mutable_keys = @cache_key_to_engine.keys.map { |k| k.dup }
    if mutable_keys.empty?
      {}
    else
      Rabl.configuration.cache_engine.read_multi(*mutable_keys)
    end
  end
end
replace_engines_with_cache_results() click to toggle source

Maps the results from the cache back to the builders

# File lib/rabl/multi_builder.rb, line 93
def replace_engines_with_cache_results
  @cache_results.each do |key, value|
    engine = @cache_key_to_engine[key]
    builder = @engine_to_builder[engine]
    builder.replace_engine(engine, value) if value
  end
end