class Polymorpheus::InterfaceBuilder

Attributes

associations[R]
interface_name[R]

Public Class Methods

new(interface_name, association_names, options) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 9
def initialize(interface_name, association_names, options)
  @interface_name = interface_name
  @associations = association_names.map do |association_name|
    Polymorpheus::InterfaceBuilder::Association.new(association_name, options)
  end
end

Public Instance Methods

active_association(calling_object) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 32
def active_association(calling_object)
  active_associations = associations.select do |association|
    # If the calling object has a non-nil value for the association
    # key, we know it has an active associatin without having to
    # make a database query to retrieve the associated object itself.
    #
    # If it has a nil value for the association key, we then ask if
    # it has a non-nil result for the association itself, since it
    # may have an active association that has not yet been saved to
    # the database.
    #
    calling_object.public_send(association.key).present? ||
      calling_object.public_send(association.name).present?
  end

  active_associations.first if active_associations.length == 1
end
active_association_key(calling_object) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 50
def active_association_key(calling_object)
  association = active_association(calling_object)
  return unless association

  association.key if calling_object.public_send(association.key)
end
association_keys() click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 24
def association_keys
  @association_keys ||= associations.map(&:key)
end
association_names() click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 28
def association_names
  @association_names ||= associations.map(&:name)
end
exposed_interface(calling_object) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 16
def exposed_interface(calling_object)
  OpenStruct.new(
    associations: associations,
    active_association: active_association(calling_object),
    query_condition: query_condition(calling_object)
  )
end
get_associated_object(calling_object) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 64
def get_associated_object(calling_object)
  association = active_association(calling_object)
  calling_object.public_send(association.name) if association
end
get_relevant_association_for_object(object_to_associate) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 78
def get_relevant_association_for_object(object_to_associate)
  match = associations.select do |association|
    object_to_associate.is_a?(association.association_class)
  end

  if match.blank?
    raise Polymorpheus::Interface::InvalidTypeError, association_names
  elsif match.length > 1
    raise Polymorpheus::Interface::AmbiguousTypeError
  end

  match.first
end
query_condition(calling_object) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 57
def query_condition(calling_object)
  key = active_association_key(calling_object)
  object = calling_object.public_send(key) if key

  { key.to_s => object } if object
end
set_associated_object(calling_object, object_to_associate) click to toggle source
# File lib/polymorpheus/interface_builder.rb, line 69
def set_associated_object(calling_object, object_to_associate)
  association = get_relevant_association_for_object(object_to_associate)
  calling_object.public_send("#{association.name}=", object_to_associate)

  (associations - [association]).each do |association|
    calling_object.public_send("#{association.name}=", nil)
  end
end