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

问题描述

我正在开展一个辅助项目,以学习将 GraphQL 实现到 Rails 6 应用程序中。为此,我使用了 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,required: false
      argument :preview_image,required: false
      argument :watched,Boolean,required: false
      field :success,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 存储库中看到 this issue 来自有相同问题的人,但是他们被告知将认值设置为 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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...