module ZendeskAPI::Associations::ClassMethods::Has

Public Instance Methods

has(resource_name_or_class, class_level_options = {}) click to toggle source

Represents a parent-to-child association between resources. Options to pass in are: class, path. @param [Symbol] resource_name_or_class The underlying resource name or a class to get it from @param [Hash] class_level_options The options to pass to the method definition.

# File lib/zendesk_api/associations.rb, line 77
def has(resource_name_or_class, class_level_options = {})
  if klass = class_level_options.delete(:class)
    resource_name = resource_name_or_class
  else
    klass = resource_name_or_class
    resource_name = klass.singular_resource_name
  end

  class_level_association = build_association(klass, resource_name, class_level_options)
  class_level_association.merge!(:singular => true, :id_column => "#{resource_name}_id")

  associations << class_level_association

  define_used(class_level_association)
  define_has_getter(class_level_association)
  define_has_setter(class_level_association)
end

Private Instance Methods

define_has_getter(association) click to toggle source
# File lib/zendesk_api/associations.rb, line 97
def define_has_getter(association)
  klass = association[:class] # shorthand

  define_method association[:name] do |*args|
    instance_options = args.last.is_a?(Hash) ? args.pop : {}

    # return if cached
    cached = instance_variable_get("@#{association[:name]}")
    return cached if cached && !instance_options[:reload]

    # find and cache association
    instance_association = Association.new(association.merge(:parent => self))
    resource = if klass.respond_to?(:find) && resource_id = method_missing(association[:id_column])
      klass.find(@client, :id => resource_id, :association => instance_association)
    elsif found = method_missing(association[:name].to_sym)
      wrap_resource(found, association, :include_key => association[:include_key])
    elsif klass.superclass == DataResource && !association[:inline]
      response = @client.connection.get(instance_association.generate_path(:with_parent => true))
      klass.new(@client, response.body[klass.singular_resource_name].merge(:association => instance_association))
    end

    send("#{association[:id_column]}=", resource.id) if resource && has_key?(association[:id_column])
    instance_variable_set("@#{association[:name]}", resource)
  end
end
define_has_setter(association) click to toggle source
# File lib/zendesk_api/associations.rb, line 123
def define_has_setter(association)
  define_method "#{association[:name]}=" do |resource|
    resource = wrap_resource(resource, association)
    send("#{association[:id_column]}=", resource.id) if has_key?(association[:id_column])
    instance_variable_set("@#{association[:name]}", resource)
  end
end