Где
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)
...
}
Я неправильно называю метод функции? Любые предложения приветствуются.


Вероятно, вы захотите использовать разрешение в блоке вместо функции (которая является опцией метода поля, а не помощником, доступным в блоке):
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
Что ж, их надо добавить, потому что FindRecord.new(:directory).call так же получает те же аргументы. Если они не применяются, вы можете попробовать: resolve ->(obj, args,ctx) { FindRecord.new(:directory).call(obj, args,ctx) }
Это не решило проблему, но это была единственная и разумная попытка, поэтому награда была назначена. Спасибо @elyalvarado.
Но тогда аргументы в функции не применяются, и их нужно добавлять отдельно в каждое поле.