Skip to content

Commit db43388

Browse files
RogersRogers
Rogers
authored and
Rogers
committed
Refactor side load
1 parent eaa6821 commit db43388

File tree

1 file changed

+65
-52
lines changed

1 file changed

+65
-52
lines changed

lib/zendesk_api/association.rb

+65-52
Original file line numberDiff line numberDiff line change
@@ -73,72 +73,85 @@ def generate_path(*args)
7373
namespace.join("/")
7474
end
7575

76-
# Tries to place side loads onto given resources.
77-
def side_load(resources, side_loads)
78-
key = "#{options.name}_id"
79-
plural_key = "#{Inflection.singular options.name.to_s}_ids"
80-
81-
resources.each do |resource|
82-
if resource.key?(plural_key) # Grab associations from child_ids field on resource
83-
side_load_from_child_ids(resource, side_loads, plural_key)
84-
elsif resource.key?(key) || options.singular
85-
side_load_from_child_or_parent_id(resource, side_loads, key)
86-
else # Grab associations from parent_id field from multiple child resources
87-
side_load_from_parent_id(resource, side_loads, key)
76+
class SideLoad
77+
class << self
78+
attr_reader :options
79+
80+
def side_load(resources, side_loads)
81+
key = "#{options.name}_id"
82+
plural_key = "#{Inflection.singular options.name.to_s}_ids"
83+
84+
resources.each do |resource|
85+
if resource.key?(plural_key) # Grab associations from child_ids field on resource
86+
side_load_from_child_ids(resource, side_loads, plural_key)
87+
elsif resource.key?(key) || options.singular
88+
side_load_from_child_or_parent_id(resource, side_loads, key)
89+
else # Grab associations from parent_id field from multiple child resources
90+
side_load_from_parent_id(resource, side_loads, key)
91+
end
92+
end
8893
end
89-
end
90-
end
9194

92-
private
95+
private
9396

94-
# @return [Array<String>] ['ZendeskAPI', 'Voice', etc.. ]
95-
def ignorable_namespace_strings
96-
ZendeskAPI::DataNamespace.descendants.map { |klass| klass.to_s.split('::') }.flatten.uniq
97-
end
97+
def _side_load(resource, side_loads)
98+
side_loads.map! do |side_load|
99+
resource.send(:wrap_resource, side_load, options)
100+
end
98101

99-
def _side_load(resource, side_loads)
100-
side_loads.map! do |side_load|
101-
resource.send(:wrap_resource, side_load, options)
102-
end
102+
ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection|
103+
collection.replace(side_loads)
104+
end
105+
end
103106

104-
ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection|
105-
collection.replace(side_loads)
106-
end
107-
end
107+
def side_load_from_parent_id(resource, side_loads, key)
108+
key = "#{resource.class.singular_resource_name}_id"
108109

109-
def side_load_from_parent_id(resource, side_loads, key)
110-
key = "#{resource.class.singular_resource_name}_id"
110+
resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
111+
side_load[key] == resource.id
112+
}))
113+
end
111114

112-
resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
113-
side_load[key] == resource.id
114-
}))
115-
end
115+
def side_load_from_child_ids(resource, side_loads, plural_key)
116+
ids = resource.send(plural_key)
116117

117-
def side_load_from_child_ids(resource, side_loads, plural_key)
118-
ids = resource.send(plural_key)
118+
resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
119+
ids.include?(side_load[options.include_key])
120+
}))
121+
end
119122

120-
resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
121-
ids.include?(side_load[options.include_key])
122-
}))
123-
end
123+
def side_load_from_child_or_parent_id(resource, side_loads, key)
124+
# Either grab association from child_id field on resource or parent_id on child resource
125+
if resource.key?(key)
126+
id = resource.send(key)
127+
include_key = options.include_key
128+
else
129+
id = resource.id
130+
include_key = "#{resource.class.singular_resource_name}_id"
131+
end
124132

125-
def side_load_from_child_or_parent_id(resource, side_loads, key)
126-
# Either grab association from child_id field on resource or parent_id on child resource
127-
if resource.key?(key)
128-
id = resource.send(key)
129-
include_key = options.include_key
130-
else
131-
id = resource.id
132-
include_key = "#{resource.class.singular_resource_name}_id"
133-
end
133+
return unless id
134134

135-
return unless id
135+
side_load = side_loads.detect do |side_load|
136+
id == side_load[include_key]
137+
end
136138

137-
side_load = side_loads.detect do |side_load|
138-
id == side_load[include_key]
139+
resource.send("#{options.name}=", side_load) if side_load
140+
end
139141
end
142+
end
140143

141-
resource.send("#{options.name}=", side_load) if side_load
144+
# Tries to place side loads onto given resources.
145+
def side_load(resources, side_loads)
146+
SideLoad.instance_variable_set '@options', options
147+
SideLoad.side_load(resources, side_loads)
148+
end
149+
150+
private
151+
152+
# @return [Array<String>] ['ZendeskAPI', 'Voice', etc.. ]
153+
def ignorable_namespace_strings
154+
ZendeskAPI::DataNamespace.descendants.map { |klass| klass.to_s.split('::') }.flatten.uniq
142155
end
143156

144157
def build_parent_namespace(parent_class, instance, options, original_options)

0 commit comments

Comments
 (0)