@@ -3,17 +3,22 @@ module Preload
33 # Provides an instrument for the GraphQL::Field :preload definition
44 class Instrument
55 def instrument ( _type , field )
6- return field unless field . metadata . include? ( :preload )
6+ metadata = merged_metadata ( field )
7+ return field if metadata . fetch ( :preload , nil ) . nil?
78
89 old_resolver = field . resolve_proc
910 new_resolver = -> ( obj , args , ctx ) do
1011 return old_resolver . call ( obj , args , ctx ) unless obj
1112
12- if field . metadata [ :preload_scope ]
13- scope = field . metadata [ :preload_scope ] . call ( args , ctx )
13+ if metadata [ :preload_scope ]
14+ scope = metadata [ :preload_scope ] . call ( args , ctx )
1415 end
1516
16- preload ( obj . object , field . metadata [ :preload ] , scope ) . then do
17+ is_graphql_object = obj . is_a? ( GraphQL ::Schema ::Object )
18+ respond_to_object = obj . respond_to? ( :object )
19+ record = is_graphql_object && respond_to_object ? obj . object : obj
20+
21+ preload ( record , metadata [ :preload ] , scope ) . then do
1722 old_resolver . call ( obj , args , ctx )
1823 end
1924 end
@@ -77,6 +82,17 @@ def instrument(_type, field)
7782 loader . scope = scope
7883 loader . load ( record )
7984 end
85+
86+ private def merged_metadata ( field )
87+ type_class = field . metadata . fetch ( :type_class , nil )
88+
89+ if type_class . nil? || !type_class . respond_to? ( :to_graphql )
90+ field . metadata
91+ else
92+ field . metadata . merge ( type_class . to_graphql . metadata )
93+ end
94+ end
95+
8096 end
8197 end
8298end
0 commit comments