如何使用graphql-ruby正确更新模型



我正在做一个附带项目,学习GraphQL在Rails6应用程序中的实现。为此,我使用了graphql-ruby-gem。

我有一个解决方法来更新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-repo中看到了这个问题,但他们被告知要将默认值设置为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特有的问题。

最新更新