module DataBroker::ValueObject::ClassMethods

Public Instance Methods

belongs_to(method) click to toggle source
# File lib/data_broker/value_object.rb, line 39
def belongs_to(method)
  mapper = "#{camelize(method.to_s)}Mapper"
  via = foreign_key(camelize(method.to_s))

  define_method(method) do
    ivar = "@#{method}"
    instance_variable_get(ivar) || instance_variable_set(
      ivar, constantize(mapper).find(self.send(via))
    )
  end
end
delegate(method, to: nil, return_on_nil: nil) click to toggle source
# File lib/data_broker/value_object.rb, line 74
def delegate(method, to: nil, return_on_nil: nil)
  delegated = "#{to}_#{method}"
  define_method(delegated) do
    ivar = "@#{delegated}"
    instance_variable_get(ivar) ||
      instance_variable_set(ivar, send(to).try(method)) ||
      return_on_nil
  end
end
has_many(method) click to toggle source
# File lib/data_broker/value_object.rb, line 51
def has_many(method)
  mapper = "#{classify(method.to_s)}Mapper"
  via = foreign_key(self.to_s)
  ids_method = pluralize(foreign_key(classify(method.to_s)))

  define_method(method) do
    ivar = "@#{method}"
    instance_variable_get(ivar) || -> {
      instance_variable_set("@#{ids_method}", nil)
      instance_variable_set(
        ivar, constantize(mapper).where(via.to_sym => self.id)
      )
    }.call
  end

  define_method(ids_method) do
    ivar = "@#{ids_method}"
    instance_variable_get(ivar) || instance_variable_set(
      ivar, send(method).map(&:id)
    )
  end
end