module PlainModel::Modeling::Associatable

Public Instance Methods

association_loaded?(name) click to toggle source
# File lib/plain_model/modeling/associatable.rb, line 55
def association_loaded?(name)
  associations.key?(name.to_s)
end
associations() click to toggle source
# File lib/plain_model/modeling/associatable.rb, line 12
def associations
  @associations ||= {}
end
define_association(name, options = {}) click to toggle source
# File lib/plain_model/modeling/associatable.rb, line 21
def define_association(name, options = {})
  name = name.to_s
  association_builder_class = options.fetch(:klass) { ::PlainModel::AssociationBuilder }
  association_builder = association_builder_class.new self, options.except(:klass)
  self.association_types = association_types.merge(name => association_builder)
  define_association_methods(name)
end
define_association_methods(name) click to toggle source
# File lib/plain_model/modeling/associatable.rb, line 29
def define_association_methods(name)
  define_method(name) do
    return associations[name] if association_loaded?(name)

    associations[name] = load_association(name)
  end

  define_method("#{name}=") do |value|
    associations[name] = value
  end
end
load_association(records, name, context: nil, includes: {}) click to toggle source
# File lib/plain_model/modeling/associatable.rb, line 41
def load_association(records, name, context: nil, includes: {})
  association_builder = association_types.fetch(name.to_s) do
    raise ArgumentError, "invalid association #{name}"
  end
  association_builder.load_records(name, records, context: context, includes: includes)
end
load_associations(records, includes, context: nil) click to toggle source
# File lib/plain_model/modeling/associatable.rb, line 48
def load_associations(records, includes, context: nil)
  includes.each do |name, nested|
    load_association(records, name, context: context, includes: nested)
  end
end