module Pupper::ApiAssociations

Public Instance Methods

associations() click to toggle source
# File lib/pupper/api_associations.rb, line 6
def associations
  @associations ||= { has_one: [], has_many: [] }
end
build_associations(assocs) click to toggle source
# File lib/pupper/api_associations.rb, line 25
def build_associations(assocs)
  assocs.each_with_object({}) do |(name, value), memo|
    name = name.to_s
    foreign_key = name.slice!(/_u?id/)&.[](1..-1)&.to_sym
    name = name.to_sym

    create_assoc_model(memo, name, foreign_key, value)
  end
end
create_assoc_model(assocs, name, foreign_key, value) click to toggle source
# File lib/pupper/api_associations.rb, line 65
def create_assoc_model(assocs, name, foreign_key, value)
  case find_assoc_type(name)
  when :has_one
    assocs[name] = create_has_one_assoc_model(name, foreign_key, value)
  when :has_many
    assocs[name] = create_has_many_assoc_model(name, value)
  else
    name = foreign_key.present? ? "#{name}_#{foreign_key}" : name
    assocs[name.to_sym] = value
  end
end
create_attribute(name, foreign_key = nil, value = nil) click to toggle source
# File lib/pupper/api_associations.rb, line 35
def create_attribute(name, foreign_key = nil, value = nil)
  self.class.attr_accessor(name)
  excluded_attrs << name if foreign_key.present?

  name = foreign_key.present? ? "#{name}_#{foreign_key}" : name
  send("#{name}=", value)
end
create_has_many_assoc_model(name, values) click to toggle source
# File lib/pupper/api_associations.rb, line 59
def create_has_many_assoc_model(name, values)
  create_attribute(name)
  model = "#{self.class.parent}/#{name.to_s.singularize}".classify.constantize
  values.map(&model.method(:new))
end
create_has_one_assoc_model(name, foreign_key, value) click to toggle source
# File lib/pupper/api_associations.rb, line 48
def create_has_one_assoc_model(name, foreign_key, value)
  create_attribute(name, foreign_key, value)
  model = "#{self.class.parent}/#{name}".classify.constantize

  if foreign_key
    model.new(foreign_key => value)
  else
    model.new(value)
  end
end
excluded_attrs() click to toggle source
# File lib/pupper/api_associations.rb, line 77
def excluded_attrs
  @excluded_attrs ||= []
end
find_assoc_type(name) click to toggle source
# File lib/pupper/api_associations.rb, line 43
def find_assoc_type(name)
  associations
    .find { |(_, assoc)| assoc.include?(name) }&.first
end
has_many(*assocs) click to toggle source
# File lib/pupper/api_associations.rb, line 14
def has_many(*assocs)
  associations[:has_many].concat(assocs)
end
has_one(*assocs) click to toggle source
# File lib/pupper/api_associations.rb, line 10
def has_one(*assocs)
  associations[:has_one].concat(assocs)
end