【问题标题】:Ruby GraphQL returning different typesRuby GraphQL 返回不同的类型
【发布时间】:2020-03-05 13:02:43
【问题描述】:

我正在尝试从使用 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, Int, null: false, camelize: false
  end
end

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

【问题讨论】:

标签: ruby-on-rails ruby graphql


【解决方案1】:

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

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

  1. 只用字符串;如果前端需要,将其解析为布尔值。
  2. value展开成两个字段;一个是布尔值,一个是字符串。声明两个null: true,并且只给适当类型的字段一个值。这样你就可以在后端复用序列化器,而前端只需要检查哪个字段有非空值。

    2a。您可以使用 value (String) 和 type (String 值,"Boolean""String") 字段之一,而不是 BooleanString 字段。相同的信息,不同的编码方式。

我正在想办法使用Inline Fragments;我认为这是可行的,但麻烦多于它的价值。

【讨论】:

    猜你喜欢
    • 2020-11-28
    • 2018-03-24
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多