为什么GraphQL-Ruby不理解动态生成的模式定义?



在Rails应用程序中,我定义了模式的以下部分:

# frozen_string_literal: true
module Types
module KVInfo
def self.kv_value_scalar(typename, raw_type: String, typeid:)
clazz = Class.new(BaseObject) do
graphql_name "KVEntry#{typename}Value"
field :value, raw_type, null: false
end
clazz.define_singleton_method(:typeid) { typeid }
clazz.define_singleton_method(:typename) { typename }
clazz
end
# typeids taken from enum in (.../kv_info.ts)
KVScalars = [
kv_value_scalar('String', typeid: 0),
kv_value_scalar('Markdown', typeid: 1),
kv_value_scalar(
'Date',
raw_type: GraphQL::Types::ISO8601DateTime,
typeid: 2
),
kv_value_scalar('Country', typeid: 3),
kv_value_scalar('Address', typeid: 5)
].freeze
KVScalars.each { |t| KVInfo.const_set(t.graphql_name, t) }
class KVScalarValue < BaseUnion
possible_types(*KVScalars)
def self.resolve_type(obj, _ctx)
KVScalars.select { |t| t.typeid == obj['type'] }.first
end
end
def self.kv_value_array(subtype)
clazz = Class.new(BaseObject) do
graphql_name "KVEntryArray#{subtype.typename}"
field :value, [subtype], null: false
end
clazz.define_singleton_method(:sub_typeid) { subtype.typeid }
clazz
end
KVArrays = KVScalars.map { |s| kv_value_array(s) }
KVArrays.each { |t| KVInfo.const_set(t.graphql_name, t) }
class KVArrayValue < BaseUnion
possible_types(*KVArrays)
def self.resolve_type(obj, _ctx)
KVArrays.select { |t| t.sub_typeid == obj['subtype'] }
end
end
class KVValue < BaseUnion
# PP HERE
possible_types(KVArrayValue, KVScalarValue)
def self.resolve_type(obj, _ctx)
obj['type'] == 4 ? # typeid for array
KVArrayValue :
KVScalarValue
end
end
class KVEntry < BaseObject
field :name, String, null: false
field :value, KVValue, null: false
end
end
end

当运行一个Rake任务将整个模式转储到一个供前端使用的文件时,我看到由KVEntry类表示的类型只有name字段。如果我把所有可能的类型放在KVValue类中,像这样:

pp(*KVScalars, *KVArrays)
possible_types(*KVScalars, *KVArrays)

可以正常工作并正确生成类型。但是请注意上面的pp行—如果没有这行(???),它就不能工作。此外,如果我保持原样(使用嵌套的联合),无论pp子句的数量和位置如何,它都不起作用。在调试器中,所有类都被正确加载,包括生成的类,但是模式仍然缺少所需的类型。

所以问题是bisq。为什么不处理类型,pp如何在某种意义上影响这个过程?

注:数据格式由前端固定,不允许更改。

问题出在嵌套的联合。GraphQL不支持这些。在普通联合不工作的部分-我仍然不知道这种行为的原因,但它在n次重启后修复了自己。

相关内容

  • 没有找到相关文章

最新更新