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


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类型的查询。我的印象是加上"实现"到对象类型,将允许他们从接口继承字段(根据此链接:https://graphql-ruby.org/type_definitions/interfaces),我将能够像这样查询:

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

但是我在图形中得到错误,例如"字段'name'不存在于类型'SomeProgram'"。我错过了什么?

更新:

My QueryType类:

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吗?

如果你正在使用graphhiql应用程序,你也可以通过查看模式来调试它。你可以看到someProgram的返回类型应该是ProgramType的类型。

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

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

首先查看返回类型是什么,以及resolve_type

中是否正确处理了返回类型

我找到了问题所在。我把implements Types::SomeProgram写成了implements Types:SomeProgram。我少了一个冒号。

最新更新