首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用graphql-ruby正确更新模型?

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

Stack Overflow用户
提问于 2021-04-01 07:11:39
回答 1查看 128关注 0票数 0

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

我有一个resolve方法来更新一个媒体模型,如下所示:

代码语言:javascript
复制
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字段,我会收到一个声明为missing keywords: :title, :release_date, :preview_url, :preview_image的500错误。

我在graphql-ruby库中看到了某个有同样问题的人的this issue,但是他们被告知将默认值设置为nil,当我尝试这样做时,它当然会将该模型的每一列都设置为零。

我希望能够只更改实际作为参数传递的字段,而不影响其他字段。我如何既允许必需的参数(id),也允许可选的参数?

EN

回答 1

Stack Overflow用户

发布于 2021-04-02 07:36:21

终于想明白了。通过像这样定义方法:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66896441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档