27

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
4

2 回答 2

33

我认为截至 2017 年 7 月还没有一个明确的事实标准,而且我看到实现之间存在很多差异(GitHub、Yelp、GraphCool、Shopify)。

然而,如果你看一下最近出现的一些 GraphQL API,似乎有一个共同的趋势。很大程度上,输入类型和响应类型是特定于突变的。因此,例如,对于一个updateBrand突变,您可能期望一个UpdateBrandInput, 并返回一个UpdateBrandPayload响应。请注意,输入不是BrandInput,并以 响应Brand。您也不会以标量布尔值(例如,true如果成功)或id已删除实体的 (在删除突变的情况下)进行响应。按照这个约定,你可以有一个createBrand突变,带有一个CreateBrandInput和一个CreateBrandPayload响应。

通过创建特定的突变inputpayload类型,您可以在您期望和响应的领域拥有很大的灵活性。每次删除,您的DeleteBrandPayload响应可能不仅包括品牌的浅层(例如仅标量)字段,还包括其他相关数据(例如clientMutationId)等。

老实说,我认为 GraphQL 规范提供了足够的绳索来吊死你自己,所以看看一些大人物是如何推出这个的是明智的。

于 2017-07-22T23:55:42.460 回答
6

您可以返回 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/

于 2017-05-23T10:17:23.740 回答