Graphql-Ruby:创建对象可以从中继承字段的接口

Graphql-Ruby: Creating interfaces that objects can inherit fields from

    module Types::ProgramType
        include Types::BaseInterface
    
        description "Objects which inherit from Program"
        graphql_name "Program"
        orphan_types Types::SomeProgramType, Types::AnotherProgramType, Types::ThirdProgramType
    
        field :id, ID, null: false
        field :type, Integer, null: false
        field :name, String, null: false

    definition_methods do
      def self.resolve_type(object, _context)
        case object.class
        when SomeProgram then SomeProgramType
        when AnotherProgram then AnotherProgramType
        when ThirdProgram then ThirdProgramType
        else
          raise "Unknown program type"
        end
      end
    end
    end
    
    module Types
      class SomeProgramType < Types::BaseObject
        implements Types:ProgramType
    
        field :description, String, null: false
      end
    end

我还在 query_type 文件中添加了对 SomeProgram 类型的查询。我的印象是将“实现”添加到对象类型,将允许它们从接口继承字段(根据这个link:https://graphql-ruby.org/type_definitions/interfaces),我将能够像这样查询:

    query {
            someProgram(id: 1) {
               name
               type
               description
            }
}
     

但我在 graphiql 中遇到错误,例如“字段 'name' 在类型 'SomeProgram' 上不存在”。我错过了什么?

更新:

我的查询类型class:

class QueryType < Types::BaseObject
    # Add `node(id: ID!) and `nodes(ids: [ID!]!)`
    include GraphQL::Types::Relay::HasNodeField
    include GraphQL::Types::Relay::HasNodesField

    field :some_programs, [SomeProgramType], null: false,
      description: "all some programs"

    def some_programs
      SomeProgram.all
    end

    field :some_program, SomeProgramType, null: false do
      argument :id, ID, required: true
    end

    def some_program(id:)
      SomeProgram.find(id)
    end
end

您能否也分享一下如何在查询类型中公开 someProgram

如果您使用的是 GraphiQL 应用程序,您还可以通过查看架构来调试它。可以看到 someProgram 的 return 类型应该是 ProgramType.

的类型

您还可以更新您的查询以包含 __typename,因此可以从

开始
query {
   someProgram(id: 1) {
       __typename
   }
}
     

首先看看什么是 return 类型,以及它是否在 resolve_type

中被正确处理

我想通了这个问题。我用 implements Types:SomeProgram 而不是 implements Types::SomeProgram。我少了一个冒号。