module DataBroker::Mapper::InstanceMethods

Attributes

children[RW]
mapping[RW]
model[RW]
parents[RW]
record[RW]

Public Class Methods

new(mapping:, parents:, children:, record: nil, model: nil) click to toggle source
# File lib/data_broker/mapper.rb, line 61
def initialize(mapping:, parents:, children:, record: nil, model: nil)
  self.mapping = mapping
  self.parents = parents || {}
  self.children = children || {}
  self.record = record || infer(:record)
  self.model = model || infer(:model)
end

Public Instance Methods

all(eager_load: false) click to toggle source
# File lib/data_broker/mapper.rb, line 69
def all(eager_load: false)
  recs = eager_record(eager_load)
  recs = eager_load ? recs.to_a : recs.all
  records_to_objects(recs, :eager_load => eager_load)
end
destroy(model, eager_load: false) click to toggle source
# File lib/data_broker/mapper.rb, line 101
def destroy(model, eager_load: false)
  record = self.eager_record(eager_load).find_by(:id => model.id)
  if record.nil?
    nil
  else
    records_to_objects(record.destroy, :eager_load => false).first
  end
end
eager_record(eager_load) click to toggle source
# File lib/data_broker/mapper.rb, line 122
def eager_record(eager_load)
  if eager_load
    self.record.includes(parents.values)
  else
    self.record
  end
end
find(id, eager_load: true) click to toggle source
# File lib/data_broker/mapper.rb, line 75
def find(id, eager_load: true)
  record = self.eager_record(eager_load).find_by(:id => id)
  if record.nil?
    nil
  else
    records_to_objects(record, :eager_load => eager_load).first
  end
end
records_to_objects(records, eager_load: false) click to toggle source
# File lib/data_broker/mapper.rb, line 110
def records_to_objects(records, eager_load: false)
  records = [*records]
  records.compact.map do |record|
    attributes = Hash[self.mapping.map { |key, value| [key, record[value]] }]
    self.model.new(attributes).tap do |obj|
      load_parents!(obj, record) if eager_load
    end
  end.tap do |recs|
    load_children!(recs) if eager_load
  end
end
save(model, eager_load: true) click to toggle source
# File lib/data_broker/mapper.rb, line 91
def save(model, eager_load: true)
  record = self.eager_record(eager_load).find_by(:id => model.id) || self.record.new
  attributes = Hash[self.mapping.map { |key, value| [value, model[key]] }]
  attributes.delete(:id)
  record.attributes = attributes

  record.save!
  records_to_objects(record.reload, :eager_load => eager_load).first
end
where(eager_load: true, **conds) click to toggle source
# File lib/data_broker/mapper.rb, line 84
def where(eager_load: true, **conds)
  conds = Hash[conds.map { |key, value| [self.mapping[key], value] }]
  records_to_objects(
    self.eager_record(eager_load).where(conds), :eager_load => eager_load
  )
end

Private Instance Methods

foreign_key() click to toggle source
# File lib/data_broker/mapper.rb, line 181
def foreign_key
  @foreign_key ||= "#{inferred_basename.underscore}_id"
end
infer(attr) click to toggle source
# File lib/data_broker/mapper.rb, line 194
def infer(attr)
  @infer ||= {}
  @infer[attr] ||= if attr == :model
                     inferred_model
                   else
                     "#{inferred_basename}#{attr.to_s.camelize}"
                       .safe_constantize
                   end
end
inferred_basename() click to toggle source
# File lib/data_broker/mapper.rb, line 185
def inferred_basename
  @inferred_basename ||= self.class.to_s.underscore.sub(/_mapper$/, "")
    .singularize.camelize
end
inferred_model() click to toggle source
# File lib/data_broker/mapper.rb, line 190
def inferred_model
  @inferred_model ||= inferred_basename.safe_constantize
end
load_children!(records) click to toggle source
# File lib/data_broker/mapper.rb, line 152
def load_children!(records)
  ids = records.map(&:id)
  self.children.each do |model_ref, record_ref|
    rec = record_for(model_ref)
    rels = rec
      .where(foreign_key => ids)
      .pluck(foreign_key, :id)

    records.each do |r|
      r.instance_variable_set(
        :"@#{model_ref.to_s.singularize}_ids",
        rels.map { |id, vals| vals if id == r.id  }.compact
      )
    end
  end
end
load_parent(parent_record, model) click to toggle source
# File lib/data_broker/mapper.rb, line 144
def load_parent(parent_record, model)
  @load_parent ||= {}
  @load_parent[parent_record] ||= -> {
    mapper = mapper_for(model)
    mapper.construct_instance.records_to_objects(parent_record, :eager_load => false).first
  }.call
end
load_parents!(obj, record) click to toggle source
# File lib/data_broker/mapper.rb, line 134
def load_parents!(obj, record)
  self.parents.each do |model_ref, record_ref|
    parent_record = record.send(record_ref)
    if parent_record
      parent = load_parent(parent_record, model_ref)
      obj.instance_variable_set(:"@#{model_ref}", parent)
    end
  end
end
mapper_for(model_ref) click to toggle source
# File lib/data_broker/mapper.rb, line 169
def mapper_for(model_ref)
  @mapper_for ||= {}
  @mapper_for[model_ref] ||= "#{model_ref.to_s.singularize}_mapper"
    .camelize.safe_constantize
end
record_for(model_ref) click to toggle source
# File lib/data_broker/mapper.rb, line 175
def record_for(model_ref)
  @record_for ||= {}
  @record_for[model_ref] ||= "#{model_ref.to_s.singularize}_record"
    .camelize.safe_constantize
end