module ZendeskAPI::Associations::ClassMethods::HasMany

Public Instance Methods

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

Represents a parent-to-children association between resources. Options to pass in are: class, path. @param [Symbol] resource_name_or_class The underlying resource name or 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 136
def has_many(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.resource_name
  end

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

  associations << class_level_association

  define_used(class_level_association)
  define_has_many_getter(class_level_association)
  define_has_many_setter(class_level_association)
end

Private Instance Methods

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

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

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

    # find and cache association
    instance_association = Association.new(association.merge(:parent => self))
    singular_resource_name = Inflection.singular(association[:name].to_s)

    resources = if (ids = method_missing("#{singular_resource_name}_ids")) && ids.any?
      ids.map do |id|
        klass.find(@client, :id => id, :association => instance_association)
      end.compact
    elsif (resources = method_missing(association[:name].to_sym)) && resources.any?
      resources.map { |res| wrap_resource(res, association) }
    else
      []
    end

    collection = ZendeskAPI::Collection.new(@client, klass, instance_opts.merge(:association => instance_association))

    if association[:extensions].any?
      collection.extend(*association[:extensions])
    end

    if resources.any?
      collection.replace(resources)
    end

    send("#{association[:id_column]}=", resources.map(&:id)) if has_key?(association[:id_column])
    instance_variable_set("@#{association[:name]}", collection)
  end
end
define_has_many_setter(association) click to toggle source
# File lib/zendesk_api/associations.rb, line 195
def define_has_many_setter(association)
  define_method "#{association[:name]}=" do |resources|
    if resources.is_a?(Array)
      wrapped = resources.map { |attr| wrap_resource(attr, association) }
      send(association[:name]).replace(wrapped)
    else
      resources.association = Association.new(association.merge(:parent => self))
      instance_variable_set("@#{association[:name]}", resources)
    end

    send("#{association[:id_column]}=", resources.map(&:id)) if resources && has_key?(association[:id_column])
    resource
  end
end