Как обрабатывать поле, которое может возвращать один из нескольких скалярных типов в graphql


В graphql (используя превосходный graphql-ruby gem), я пытаюсь вернуть объект с полем, которое может равняться либо Булеву, целому числу, либо строке. Моя первоначальная мысль состояла в том, чтобы вернуть объединение булевых, целых или строковых чисел, но graphql-ruby сообщил мне, что объединения не могут содержать скалярные типы (я полагаю, что это ограничение, наложенное спецификацией, а не graphql-ruby).

Решение, которое я могу придумать (не очень), состоит в том, чтобы вернуть значение в виде строки json и проанализировать его на клиенте сторона. Существует ли лучший способ обработки возвращаемого значения, которое может быть одним из нескольких скаляров?

Спасибо!

1 3

1 ответ:

Я смог добиться этого, создав пользовательский скалярный тип graphql, который просто проверяет, является ли значение Булевым, целочисленным или строковым, и если да, то возвращает это значение без изменений. В противном случае возвращается ошибка. Это решение не требует дополнительного анализа на стороне клиента.

В graphql-ruby реализация выглядит как

GraphScalar::AnyPrimative = GraphQL::ScalarType.define do
  name "AnyPrimativeScalar"

  coerce_input ->(value, ctx) { 
    case value
    when String, TrueClass, FalseClass, Integer, Float then value
    else
      GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}")
    end
  }

  coerce_result ->(value, ctx) { 
    case value
    when String, TrueClass, FalseClass, Integer, Float then value
    else
      GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}")
    end
  }
end

Примечание: эта реализация фактически позволяет использовать поплавки