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