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
。我少了一个冒号。