Мутация нескольких объектов в Ruby GraphQL с GraphQLList - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть приложение Rails API с GraphQL. В настоящее время я пытаюсь создать мутацию для обновления нескольких объектов одновременно.

module Mutations
  module Widgets
    class UpdateWidgets < ::Mutations::BaseMutation
      argument :widgets, [Types::WidgetType, null: true], required: true

      field :widgets, [Types::WidgetType], null: true
      field :errors,  [String], null: true

      def resolve(widgets:)
        # update widgets here
      end
    end
  end
end

Я получаю следующую ошибку:

GraphQL::Schema::InvalidTypeError:
     Argument input on Mutation.updateWidgets is invalid: argument "widgets" type must be a valid input type (Scalar or InputObject), not GraphQL::ListType ([Widget!])

Затем я услышал предложение сделать его Input Object, и я сделал следующее:

module Types
  class UpdateWidgetsType < Types::BaseInputObject
    description 'Input for multiple widgets'
    argument :widgets, [Types::WidgetType, null: true], required: true
  end
end

Теперь, когда это тип Input, я изменил мутацию так, чтобы вместо нее вызывался

argument :update_widgets, Types::UpdateWidgetType, required: true

и получил аналогичный ошибка:

GraphQL::Schema::InvalidTypeError:
     Input field UpdateWidgetsInput.updateWidgets is invalid: argument "widgets" type must be a valid input type (Scalar or InputObject), not GraphQL::NonNullType ([Widget]!)

Нужно понять, как это работает.

1 Ответ

1 голос
/ 12 февраля 2020

Мой друг подтолкнул меня в сторону Твиттера. Запустил некоторые тесты как вручную, так и с помощью RSpe c и заставил его работать.

Большая проблема заключалась в том, чтобы слишком сильно опираться на тип Widget, а не полностью извлекать его:

# app/graphql/types/update_widget_type.rb
module Types
  class UpdateWidgetType < Types::BaseInputObject
    description 'Input for a Widget'

    argument :id, Int, required: true
    argument :name, String, required: false
    # and the rest
  end
end

# app/graphql/mutations/widgets/update_widgets.rb
module Mutations
  module Widgets
    class UpdateWidgets < ::Mutations::BaseMutation

      argument :update_widgets, [Types::UpdateWidgetType, null: true], required: true

      field :widgets, [Types::WidgetType], null: true
      field :errors, [String], null: false

      def resolve(update_widgets:)
        # update widgets here
      end
    end
  end
end

запрос будет выглядеть так:

mutation {
  updateWidgets(input: {
    updateWidgets: [
      {
        id: 1
        name: "Foo"
      },
      {
        id: 2
        name: "Bar"
      }
    ]
  }
}) {
  widgets {
    id
    name
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...