Ruby GraphQL возвращает разные типы - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь перейти от использования REST API Rails к использованию 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, но я хочу, чтобы он возвращал либологическое значение или строка. Даже если я скопирую / вставлю код из сериализатора в определение типа, он все равно вернет только строку

1 Ответ

0 голосов
/ 09 ноября 2019

GraphQL строго типизирован. По замыслу нельзя объявить поле, которое может возвращать несколько типов. Это даже немного пахнет кодом, чтобы даже сделать это в ActiveRecord, tbh.

Опции, которые я рассмотрел бы для настройки, такие как:

  1. Просто используйте строку;разберите его на логическое значение, если необходимо, на переднем конце.
  2. Разверните value в два поля;тот, который является bool и тот, который является строкой. Объявите оба null: true и дайте только поле с соответствующим типом значения. Таким образом, вы можете повторно использовать сериализатор в серверной части, в то время как интерфейс должен только проверить, какое поле имеет ненулевое значение.

    2a. Вместо полей Boolean и String можно использовать поля value (String) и type (String, одно из "Boolean" или "String"). Та же информация, другой способ ее кодирования.

Я пытаюсь придумать, как использовать Встроенные фрагменты ;Я думаю, что это выполнимо, но больше проблем, чем стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...