Почему определение функции graphql-ruby работает через kwarg, но не через метод функции в блоке?

Где

class FindRecord < GraphQL::Function
  ...
  argument :id, !types.ID
  ...
end

этот вариант определения поля в блоке GraphQL::ObjectType.define работает без ошибок:

 field 'd1', DirectoryType, function: FindRecord.new(:directory) 

Но для того же запроса это не удается с сообщением об ошибке "Поле 'd2' не принимает аргумент 'id'":

field 'd2', DirectoryType do                                                                                
  function FindRecord.new(:directory)                                                               
end      

После определения этих полей для d1 и d2 значение target.fields['d?'].function будет одинаковым (с разными идентификаторами объектов). Но похоже, что в блочной версии функция не применяется к полю.

Это также не работает, когда я пропускаю помощник field и определяю поле следующим образом:

target.fields[name] = GraphQL::Field.define {
  ...
  function FindRecord.new(:directory)
  ...
}

Я неправильно называю метод функции? Любые предложения приветствуются.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
3
0
357
1

Ответы 1

Вероятно, вы захотите использовать разрешение в блоке вместо функции (которая является опцией метода поля, а не помощником, доступным в блоке):

field 'd2', DirectoryType do                                                                                
  resolve FindRecord.new(:directory)                                                               
end   

поскольку функции обычно реализуют один и тот же метод call(obj, args, ctx), тогда их можно рассматривать как Callables, и вы сможете использовать его с помощником разрешения вместо обычного способа:

field :students, types[StudentType] do
  argument :grade, types.Int
  resolve ->(obj, args, ctx) {
    Student.where(grade: args[:grade])
  }
end

Но тогда аргументы в функции не применяются, и их нужно добавлять отдельно в каждое поле.

Mori 24.04.2018 08:57

Что ж, их надо добавить, потому что FindRecord.new(:directory).call так же получает те же аргументы. Если они не применяются, вы можете попробовать: resolve ->(obj, args,ctx) { FindRecord.new(:directory).call(obj, args,ctx) }

elyalvarado 25.04.2018 00:13

Это не решило проблему, но это была единственная и разумная попытка, поэтому награда была назначена. Спасибо @elyalvarado.

Mori 25.04.2018 00:58

Другие вопросы по теме