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