【问题标题】:How to properly update model using graphql-ruby?如何使用 graphql-ruby 正确更新模型?
【发布时间】:2021-03-31 23:11:38
【问题描述】:

我正在开展一个辅助项目,以学习将 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, 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 存储库中看到 this issue 来自有同样问题的人,但是他们被告知将默认值设置为 nil,当我尝试这样做时,它当然将该模型的每一列设置为 nil .

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

【问题讨论】:

    标签: ruby-on-rails ruby graphql-ruby


    【解决方案1】:

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

    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。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2020-09-23
      • 2017-06-25
      • 2018-12-14
      • 2019-09-23
      • 2019-11-27
      • 2012-05-06
      • 2022-09-24
      • 2023-01-14
      相关资源
      最近更新 更多