簡體   English   中英

如何使用 graphql-ruby 正確更新 model?

[英]How to properly update model using graphql-ruby?

我正在從事一個輔助項目,以學習將 GraphQL 實施到 Rails 6 應用程序中。 為此,我使用了graphql-ruby gem

我有一個解決方法來更新看起來像這樣的中型 model:

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

如果我以這種方式設置 arguments 並且我只想更新被watched的字段,我會收到一個 500 錯誤,說明missing keywords: :title, :release_date, :preview_url, :preview_image

我在 graphql-ruby 存儲庫中從遇到相同問題的人那里看到了這個問題,但是他們被告知將默認值設置為nil ,當我嘗試這樣做時,它當然會將 model 的每一列設置為 nil。

我希望能夠僅更改實際作為 arguments 傳遞的字段,而不會影響其他字段。 如何同時允許必需的參數 (id) 和可選的 arguments?

終於想通了。 通過定義這樣的方法:

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM