删除突变的结果?
Posted
技术标签:
【中文标题】删除突变的结果?【英文标题】:Result of a delete mutation? 【发布时间】:2017-10-22 13:13:29 【问题描述】:Graphql 中删除突变的结果应该是什么?我正在使用 graphql-ruby gem。这是我的突变示例,但我不确定我应该返回什么作为响应。
Mutations::Brands::Delete = GraphQL::Relay::Mutation.define do
name "DeleteBrand"
description "Delete a brand"
input_field :id, types.ID
# return_field ??
resolve ->(object, inputs, ctx)
brand = Brand.find(inputs[:id])
brand.destroy
end
【问题讨论】:
我认为最佳做法是准确返回您删除的内容,以便 graphql 知道需要删除的内容。 【参考方案1】:我认为截至 2017 年 7 月尚不存在明确的事实标准,并且我发现实现之间存在很多差异(GitHub、Yelp、GraphCool、Shopify)。
但是,如果您看一下最近出现的一些 GraphQL API,似乎有一个共同的趋势。很大程度上,输入类型和响应类型是特定于突变的。例如,对于updateBrand
突变,您可能期望得到UpdateBrandInput
,并返回UpdateBrandPayload
响应。请注意,输入不是BrandInput
,而是以Brand
响应。您也不会使用标量布尔值(例如,true
,如果成功)或已删除实体的 id
(在删除突变的情况下)进行响应。按照这个约定,你可以有一个createBrand
突变,一个CreateBrandInput
和一个CreateBrandPayload
响应。
通过创建特定于突变的input
和payload
类型,您可以在期望和响应的领域拥有很大的灵活性。每次删除,您可能会有一个 DeleteBrandPayload
响应,其中不仅包括品牌的浅层(例如仅标量)字段,还包括其他相关数据(例如 clientMutationId
)等。
老实说,我认为 GraphQL 规范提供了足够的绳索来吊死你自己,所以看看一些大人物是如何推出的是明智的。
【讨论】:
有趣的事情:我正在寻找这个答案(谢谢,它非常有用),碰巧,我正在处理的突变被命名为“createBrand”、“updateBrand”和“删除品牌”:D 如果有一些你所说的“大人物”代码示例的链接会很有趣,他们有几十个存储库 你可以在这里docs.github.com/en/graphql/overview/explorer 尝试来自 Github 的 GraphQL API(你必须登录),他们使用这个命名:DeleteBrandInput
,DeleteBrandPayload
。【参考方案2】:
您可以返回 deleted_id 或消息。如果它是关联对象,您可以返回更新的对象,如下例所示。
Destroy = GraphQL::Relay::Mutation.define do
name 'DestroyComment'
description 'Delete a comment and return post and deleted comment ID'
# Define input parameters
input_field :id, !types.ID
# Define return parameters
return_field :deletedId, !types.ID
return_field :article, ArticleType
return_field :errors, types.String
resolve ->(_obj, inputs, ctx)
comment = Comment.find_by_id(inputs[:id])
return errors: 'Comment not found' if comment.nil?
article = comment.article
comment.destroy
article: article.reload, deletedId: inputs[:id]
http://tech.eshaiju.in/blog/2017/05/15/graphql-mutation-query-implementation-ruby-on-rails/
【讨论】:
这不会导致内存膨胀吗? @eshaiju以上是关于删除突变的结果?的主要内容,如果未能解决你的问题,请参考以下文章