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