Ruby GraphQL返回不同的类型

我正在尝试从使用Rails REST API迁移到使用GraphQL。我们尝试替换的REST端点之一使用了序列化器。在该序列化程序中,我们将根据字符串是“ true”还是“ false”返回字符串或布尔值。我在创建可以处理此问题的graphql对象时遇到了麻烦。我尝试创建自定义类型和自定义标量无济于事。我正在尝试使用rspec来测试graphql查询,但是当我尝试使用自定义标量或自定义类型时,我总是收到运行时错误消息: no implicit conversion of nil into String

无益的部分是我没有一种好的方法来调试导致此错误的原因。

  1. 是否有一种简单的方法来定义可以返回布尔值或字符串的graphQL字段?
  2. 有人对如何调试通过rspec收到的错误有任何建议吗?我曾尝试在不同的地方使用byebug,但是byebug的声明从未受到打击。

这是我要转换为graphql的序列化程序的示例

class ModelToSerialize < activeModel::Serializer
  attributes :id,:customization_key,:value
  # value is stored as a string in the relational database
  # customization_key is stored as an integer in the relational database  

  def value
    if object.customization_key == 1
      return true if object.value == true || object.value =~ /^(true|t|yes|y|1)$/i
      return false
    else
      object.value
    end
  end
end

这是我尝试创建的GraphQL类型:

module Types
  class ModelToSerializeType < Types::BaseObject
    field :id,Int,null: false
    field :value,String,null: false # this should return boolean OR string
    field :customization_key,null: false,camelize: false
  end
end

上面的方法不起作用,因为我将类型限制为String,但是我希望它返回布尔值或字符串。即使我将序列化程序中的代码复制/粘贴到类型定义中,它仍然只会返回一个字符串

cat2799 回答:Ruby GraphQL返回不同的类型

GraphQL是强类型的。根据设计,您不能声明可能返回多种类型的字段。甚至在ActiveRecord中也有一点代码味道,

我会考虑按原样处理设置的选项:

  1. 只需使用字符串;如果需要,可以将其解析为布尔值。
  2. value扩展为两个字段;一个是布尔,另一个是弦。同时声明null: true并仅给适当类型的字段一个值。这样,您可以在后端重用序列化器,而前端只需要检查哪个字段具有非null值即可。

    2a。可以使用BooleanString)和valueString值(其中之一)代替typeString字段"Boolean""String")字段。相同的信息,不同的编码方式。

我正在尝试一种使用Inline Fragments的方法;我认为这是可行的,但麻烦多于其价值。

本文链接:https://www.f2er.com/3134871.html

大家都在问