@@ -282,6 +282,20 @@ class Product < BaseObject
282282end
283283```
284284
285+ ### The ` @interfaceObject ` directive (Apollo Federation v2.3)
286+
287+ [ Apollo documentation] ( https://www.apollographql.com/docs/federation/federated-types/federated-directives/#interfaceobject )
288+
289+ Call ` interface_object ` within your class definition:
290+
291+ ``` ruby
292+ class Product < BaseObject
293+ interface_object
294+ key fields: :id
295+ field :id , ID , null: false
296+ end
297+ ```
298+
285299### The ` @tag ` directive (Apollo Federation v2)
286300
287301[ Apollo documentation] ( https://www.apollographql.com/docs/federation/federated-types/federated-directives/#tag )
@@ -327,7 +341,7 @@ Define a `resolve_reference` class method on your object. The method will be pas
327341class User < BaseObject
328342 key fields: :user_id
329343 field :user_id , ID , null: false
330-
344+
331345 def self .resolve_reference (reference , context )
332346 USERS .find { |user | user[:userId ] == reference[:userId ] }
333347 end
@@ -341,7 +355,7 @@ class User < BaseObject
341355 key fields: :user_id
342356 field :user_id , ID , null: false
343357 underscore_reference_keys true
344-
358+
345359 def self .resolve_reference (reference , context )
346360 USERS .find { |user | user[:user_id ] == reference[:user_id ] }
347361 end
@@ -358,6 +372,61 @@ class BaseObject < GraphQL::Schema::Object
358372end
359373```
360374
375+ ### Reference resolvers for Interfaces
376+
377+ [ Apollo documentation] ( https://www.apollographql.com/docs/federation/federated-types/interfaces/#required-resolvers )
378+
379+ ``` ruby
380+ module Product
381+ include BaseInterface
382+
383+ key fields: :id
384+ field :id , ID , null: false
385+ field :title , String , null: true
386+
387+ definition_methods do
388+ def resolve_type (obj , _ctx )
389+ if obj.is_a?(Book )
390+ BookType
391+ elsif obj.is_a?(Movie )
392+ MovieType
393+ end
394+
395+ def resolve_reference (reference , _context )
396+ PRODUCTS .find { |product | product[:id ] == reference[:id ] }
397+ end
398+ end
399+ end
400+
401+ class BookType < BaseObject
402+ implements Product
403+ graphql_name ' Book'
404+
405+ key fields: :id
406+ field :id , ID , null: false
407+ field :title , String , null: true
408+ field :pages , Integer , null: true
409+
410+ def self .resolve_reference (reference , _context )
411+ BOOKS .find { |book | book[:id ] == reference[:id ] }
412+ end
413+ end
414+
415+ class MovieType < BaseObject
416+ implements Product
417+ graphql_name ' Movie'
418+
419+ key fields: :id
420+ field :id , ID , null: false
421+ field :title , String , null: true
422+ field :minutes , Integer , null: true
423+
424+ def self .resolve_reference (reference , _context )
425+ MOVIES .find { |movie | movie[:id ] == reference[:id ] }
426+ end
427+ end
428+ ```
429+
361430### Tracing
362431
363432To support [ federated tracing] ( https://www.apollographql.com/docs/apollo-server/federation/metrics/ ) :
0 commit comments