[英]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.