Как написать мутацию graphQL, которая допускает частичное обновление? - PullRequest
0 голосов
/ 08 апреля 2019

Итак, я работаю над тем, чтобы попытаться изучить GraphQL для ruby ​​для проекта.

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

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

То, что я не могу сделать, и это выглядит безумно, это обобщить эти поля - вообще.Моя пользовательская модель будет иметь более 20 полей: номера телефонов, адреса, должность и т. Д. И т. П.,Все идет нормально.Затем я определяю поля, которые мутация может вернуть.Опять же, пока все хорошо.

Затем я перехожу к фактическому методу разрешения.

Исходный синтаксис неплох.def resolve(user_id:, name:, email:).Затем вы обнаруживаете, что, несмотря на установку значения false, вы должны включить все значения.Вам необходимо указать значения по умолчанию для необязательных переменных.Таким образом, это становится def resolve(user_id:, name: null, email: null) - но это фактически обнуляет эти значения, вы не можете делать частичные обновления.Что еще хуже, представьте, что у вас есть 20 полей, которые вы должны установить таким образом.Вы можете играть в игры, пытаясь преобразовать аргументы в словарь и отклоняя нулевые значения - но тогда вы не можете установить свойства равными nil, если они должны быть равны нулю снова.

1 Ответ

0 голосов
/ 08 апреля 2019

Решение: оператор двойных сплатов. Ваш синтаксис становится 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...