Я работаю над дополнительным проектом, чтобы изучить реализацию GraphQL в приложении Rails 6. Для этого я использую graphql-ruby драгоценный камень.
У меня есть метод разрешения для обновления модели Medium, которая выглядит следующим образом:
module Mutations
module Media
class UpdateMedia < GraphQL::Schema::Mutation
include ::GraphqlAuthenticationConcerns
include ::GraphqlActiveModelConcerns
description 'Update Media'
argument :id, Integer, required: true
argument :title, String, required: false
argument :preview_url, String, required: false
argument :preview_image, String, required: false
argument :watched, Boolean, required: false
field :success, Boolean, null: false
field :errors, [Types::ActiveModelError], null: false
field :media, Types::MediumType, null: false
def resolve(id:, title:, release_date:, preview_url:, preview_image:, watched:)
authenticate_user!
media = Medium.find(id)
media_params = {
title: title,
preview_url: preview_url,
preview_image: preview_image,
watched: watched,
}
if media.update(media_params)
success_response(media)
else
failed_response(media)
end
end
private
def success_response(media)
{
success: true,
errors: [],
media: media
}
end
def failed_response(media)
{
success: false,
errors: errors(media)
}
end
end
end
end
Если я настроил аргументы таким образом и хочу обновить только поле watched, я получаю ошибку 500 с указанием missing keywords: :title, :release_date, :preview_url, :preview_image.
Я видел Эта проблема в репозитории graphql-ruby от кого-то с той же проблемой, однако им было сказано установить значения по умолчанию для nil, и когда я попробовал это, он, конечно, установил каждый столбец для этой модели равным нулю.
Я хочу иметь возможность изменять только поля, которые фактически передаются в качестве аргументов, не затрагивая другие. Как разрешить использование как обязательного параметра (id), так и дополнительных аргументов?





Наконец разобрался. Определив метод следующим образом:
def resolve(id:, **args)
authenticate_user!
media = Medium.find(id)
if media.update(args)
success_response(media)
else
failed_response(media)
end
end
это сохраняет аргумент id по мере необходимости и позволяет передавать другие параметры без установки для всей записи значения nil.
Оказалось, что это скорее общий вопрос Ruby, чем специфический для graphql-ruby.