Skip to content

Commit 6fd2ba6

Browse files
RogersRogers
Rogers
authored and
Rogers
committed
Refactor side_load into a separate class
1 parent db43388 commit 6fd2ba6

File tree

2 files changed

+70
-68
lines changed

2 files changed

+70
-68
lines changed

lib/zendesk_api/association.rb

+1-68
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
require 'zendesk_api/association_side_load'
12
require 'zendesk_api/helpers'
23

34
module ZendeskAPI
@@ -73,74 +74,6 @@ def generate_path(*args)
7374
namespace.join("/")
7475
end
7576

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
93-
end
94-
95-
private
96-
97-
def _side_load(resource, side_loads)
98-
side_loads.map! do |side_load|
99-
resource.send(:wrap_resource, side_load, options)
100-
end
101-
102-
ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection|
103-
collection.replace(side_loads)
104-
end
105-
end
106-
107-
def side_load_from_parent_id(resource, side_loads, key)
108-
key = "#{resource.class.singular_resource_name}_id"
109-
110-
resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
111-
side_load[key] == resource.id
112-
}))
113-
end
114-
115-
def side_load_from_child_ids(resource, side_loads, plural_key)
116-
ids = resource.send(plural_key)
117-
118-
resource.send("#{options.name}=", _side_load(resource, side_loads.select {|side_load|
119-
ids.include?(side_load[options.include_key])
120-
}))
121-
end
122-
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
132-
133-
return unless id
134-
135-
side_load = side_loads.detect do |side_load|
136-
id == side_load[include_key]
137-
end
138-
139-
resource.send("#{options.name}=", side_load) if side_load
140-
end
141-
end
142-
end
143-
14477
# Tries to place side loads onto given resources.
14578
def side_load(resources, side_loads)
14679
SideLoad.instance_variable_set '@options', options
+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
module ZendeskAPI
2+
class SideLoad
3+
class << self
4+
attr_reader :options
5+
6+
def side_load(resources, side_loads)
7+
key = "#{options.name}_id"
8+
plural_key = "#{Inflection.singular options.name.to_s}_ids"
9+
10+
resources.each do |resource|
11+
if resource.key?(plural_key) # Grab associations from child_ids field on resource
12+
side_load_from_child_ids(resource, side_loads, plural_key)
13+
elsif resource.key?(key) || options.singular
14+
side_load_from_child_or_parent_id(resource, side_loads, key)
15+
else # Grab associations from parent_id field from multiple child resources
16+
side_load_from_parent_id(resource, side_loads, key)
17+
end
18+
end
19+
end
20+
21+
private
22+
23+
def _side_load(resource, side_loads)
24+
side_loads.map! do |side_load|
25+
resource.send(:wrap_resource, side_load, options)
26+
end
27+
28+
ZendeskAPI::Collection.new(resource.client, options[:class]).tap do |collection|
29+
collection.replace(side_loads)
30+
end
31+
end
32+
33+
def side_load_from_parent_id(resource, side_loads, key)
34+
key = "#{resource.class.singular_resource_name}_id"
35+
36+
resource.send("#{options.name}=", _side_load(resource, side_loads.select { |side_load|
37+
side_load[key] == resource.id
38+
}))
39+
end
40+
41+
def side_load_from_child_ids(resource, side_loads, plural_key)
42+
ids = resource.send(plural_key)
43+
44+
resource.send("#{options.name}=", _side_load(resource, side_loads.select { |side_load|
45+
ids.include?(side_load[options.include_key])
46+
}))
47+
end
48+
49+
def side_load_from_child_or_parent_id(resource, side_loads, key)
50+
# Either grab association from child_id field on resource or parent_id on child resource
51+
if resource.key?(key)
52+
id = resource.send(key)
53+
include_key = options.include_key
54+
else
55+
id = resource.id
56+
include_key = "#{resource.class.singular_resource_name}_id"
57+
end
58+
59+
return unless id
60+
61+
side_load = side_loads.detect do |side_load|
62+
id == side_load[include_key]
63+
end
64+
65+
resource.send("#{options.name}=", side_load) if side_load
66+
end
67+
end
68+
end
69+
end

0 commit comments

Comments
 (0)