@@ -6,7 +6,7 @@ module JsonapiCompliable
66 # @attr_reader [Hash] sideloads The associated sibling sideloads
77 # @attr_reader [Proc] scope_proc The configured 'scope' block
88 # @attr_reader [Proc] assign_proc The configured 'assign' block
9- # @attr_reader [Proc] grouper The configured 'group_by' proc
9+ # @attr_reader [Symbol] grouping_field The configured 'group_by' symbol
1010 # @attr_reader [Symbol] foreign_key The attribute used to match objects - need not be a true database foreign key.
1111 # @attr_reader [Symbol] primary_key The attribute used to match objects - need not be a true database primary key.
1212 # @attr_reader [Symbol] type One of :has_many, :belongs_to, etc
@@ -15,10 +15,11 @@ class Sideload
1515 :resource_class ,
1616 :polymorphic ,
1717 :polymorphic_groups ,
18+ :parent ,
1819 :sideloads ,
1920 :scope_proc ,
2021 :assign_proc ,
21- :grouper ,
22+ :grouping_field ,
2223 :foreign_key ,
2324 :primary_key ,
2425 :type
@@ -28,12 +29,13 @@ class Sideload
2829 # An anonymous Resource will be assigned when none provided.
2930 #
3031 # @see Adapters::Abstract#sideloading_module
31- def initialize ( name , type : nil , resource : nil , polymorphic : false , primary_key : :id , foreign_key : nil )
32+ def initialize ( name , type : nil , resource : nil , polymorphic : false , primary_key : :id , foreign_key : nil , parent : nil )
3233 @name = name
3334 @resource_class = ( resource || Class . new ( Resource ) )
3435 @sideloads = { }
3536 @polymorphic = !!polymorphic
3637 @polymorphic_groups = { } if polymorphic?
38+ @parent = parent
3739 @primary_key = primary_key
3840 @foreign_key = foreign_key
3941 @type = type
@@ -55,7 +57,7 @@ def resource
5557 # +Business+ or +Government+:
5658 #
5759 # allow_sideload :organization, :polymorphic: true do
58- # group_by { |record| record. organization_type }
60+ # group_by : organization_type
5961 #
6062 # allow_sideload 'Business', resource: BusinessResource do
6163 # # ... code ...
@@ -70,7 +72,7 @@ def resource
7072 # with ActiveRecord:
7173 #
7274 # polymorphic_belongs_to :organization,
73- # group_by: ->(office) { office. organization_type } ,
75+ # group_by: : organization_type,
7476 # groups: {
7577 # 'Business' => {
7678 # scope: -> { Business.all },
@@ -181,21 +183,25 @@ def assign(&blk)
181183 # @see #name
182184 # @see #type
183185 def associate ( parent , child )
184- resource_class . config [ :adapter ] . associate ( parent , child , name , type )
186+ association_name = @parent ? @parent . name : name
187+ resource_class . config [ :adapter ] . associate parent ,
188+ child ,
189+ association_name ,
190+ type
185191 end
186192
187- # Define a proc that groups the parent records. For instance, with
193+ # Define an attribute that groups the parent records. For instance, with
188194 # an ActiveRecord polymorphic belongs_to there will be a +parent_id+
189195 # and +parent_type+. We would want to group on +parent_type+:
190196 #
191197 # allow_sideload :organization, polymorphic: true do
192198 # # group parent_type, parent here is 'organization'
193- # group_by ->(office) { office. organization_type }
199+ # group_by : organization_type
194200 # end
195201 #
196202 # @see #polymorphic?
197- def group_by ( & grouper )
198- @grouper = grouper
203+ def group_by ( grouping_field )
204+ @grouping_field = grouping_field
199205 end
200206
201207 # Resolve the sideload.
@@ -323,6 +329,13 @@ def to_hash(processed = [])
323329 result
324330 end
325331
332+ # @api private
333+ def polymorphic_child_for_type ( type )
334+ polymorphic_groups . values . find do |v |
335+ v . resource_class . config [ :type ] == type
336+ end
337+ end
338+
326339 private
327340
328341 def nested_sideload_hash ( sideload , processed )
@@ -333,8 +346,24 @@ def nested_sideload_hash(sideload, processed)
333346 end
334347 end
335348
349+ def polymorphic_grouper ( grouping_field )
350+ lambda do |record |
351+ if record . is_a? ( Hash )
352+ if record . keys [ 0 ] . is_a? ( Symbol )
353+ record [ grouping_field ]
354+ else
355+ record [ grouping_field . to_s ]
356+ end
357+ else
358+ record . send ( grouping_field )
359+ end
360+ end
361+ end
362+
336363 def resolve_polymorphic ( parents , query )
337- parents . group_by ( &@grouper ) . each_pair do |group_type , group_members |
364+ grouper = polymorphic_grouper ( @grouping_field )
365+
366+ parents . group_by ( &grouper ) . each_pair do |group_type , group_members |
338367 sideload_for_group = @polymorphic_groups [ group_type ]
339368 if sideload_for_group
340369 sideload_for_group . resolve ( group_members , query , name )
0 commit comments