Поэтому я работаю над изучением GraphQL для ruby для проекта.
У меня почти есть некоторые части, но у меня проблемы с другими частями. Существует множество руководств, которые охватывают ультра-основы, но ни одно из них, похоже, не расширяется в правильном направлении.
У меня есть мутация для обновления моего пользователя. Все идет нормально. Я могу найти пользователя по его идентификатору и обновить одно конкретное поле. Я могу расширить это до обновления двух полей.
То, что я делаю, не можем, и это выглядит безумием, — это обобщает эти поля — вообще. Моя пользовательская модель будет иметь более 20 прикрепленных к ней полей - номера телефонов, адреса, должность и т. д. и т. д.
Когда я создаю мутацию, я должен определить аргументы, которые входят в метод разрешения. Все идет нормально. Затем я определяю поля, которые может вернуть мутация. Опять же, пока все хорошо.
Затем я перехожу к фактическому методу разрешения.
Начальный синтаксис неплох. def resolve(user_id:, name:, email:). Затем вы обнаружите, что, несмотря на то, что для параметра требуется значение false, вы должны включить все значения. Вам необходимо указать значения по умолчанию для необязательных переменных. Так что это становится def resolve(user_id:, name: null, email: null) - но это фактически обнуляет эти значения, вы не можете выполнять частичные обновления. Что еще хуже, представьте, что у вас есть 20 полей, которые вы должны настроить таким образом. Вы можете играть в игры, пытаясь преобразовать аргументы в словарь и отклонить нулевые значения, но тогда вы не сможете установить свойства равными нулю, если они должны снова быть нулевыми.





Решение: двойной знаковый оператор. Ваш синтаксис становится def resolve(user_id:, **args). Насколько я могу судить, он превращает все оставшиеся именованные аргументы в словарь, и я думаю, что неименованные аргументы станут массивом. Нет уверен, как он отреагирует на их сочетание.
Полная модель становится:
argument :user_id, ID, required: true#, loads: Types::UserType
argument :name, String, required: false
argument :email, String, required: false
field :user, Types::UserType, null: true
field :errors, Types::UserType, null: true
def resolve(user_id:, **args)
user = User.find(user_id)
if user.update(args)
{
user: user,
errors: []
}
else
{
user: nil,
errors: user.errors.full_messages
}
end
end
end