class Perpetuity::Dereferencer

Attributes

map[R]
mapper_registry[R]

Public Class Methods

new(mapper_registry, identity_map=IdentityMap.new) click to toggle source
# File lib/perpetuity/dereferencer.rb, line 8
def initialize mapper_registry, identity_map=IdentityMap.new
  @map = identity_map
  @mapper_registry = mapper_registry
end

Public Instance Methods

[](reference) click to toggle source
# File lib/perpetuity/dereferencer.rb, line 25
def [] reference
  if referenceable?(reference)
    map[reference.klass, reference.id]
  else
    reference
  end
end
cache(objects) click to toggle source
# File lib/perpetuity/dereferencer.rb, line 21
def cache objects
  objects.each { |object| map << object }
end
grouped(references) click to toggle source
# File lib/perpetuity/dereferencer.rb, line 33
def grouped references
  references.group_by(&:klass)
end
load(references) click to toggle source
# File lib/perpetuity/dereferencer.rb, line 13
def load references
  references = Array(references).flatten.select {|ref| referenceable?(ref) }

  cache grouped(references).map { |klass, refs|
    objects klass, refs.map(&:id)
  }.flatten
end
objects(klass, ids) click to toggle source
# File lib/perpetuity/dereferencer.rb, line 37
def objects klass, ids
  ids = ids.uniq
  if ids.one?
    mapper_registry.mapper_for(klass, identity_map: map).find(ids.first)
  elsif ids.none?
    []
  else
    mapper_registry[klass].find(ids.uniq).to_a
  end
end
referenceable?(ref) click to toggle source
# File lib/perpetuity/dereferencer.rb, line 48
def referenceable? ref
  [:klass, :id].all? { |msg| ref.respond_to?(msg) }
end