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