删除突变的结果?

时间:2017-05-22 19:02:33

标签: graphql graphql-ruby

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

2 个答案:

答案 0 :(得分:14)

我不认为2017年7月存在明确的事实标准,我看到实现之间存在很多差异(GitHub,Yelp,GraphCool,Shopify)。

但是,如果你看一下最近出现的一些GraphQL API,似乎有一个共同的趋势。很大程度上,输入类型和响应类型是突变特有的。例如,对于$i++; $cfg['Servers'][$i]['host'] = '<rds.host.com>'; $cfg['Servers'][$i]['port'] = '3306'; $cfg['Servers'][$i]['verbose'] = 'test'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['extension'] = 'mysql'; $cfg['Servers'][$i]['compress'] = TRUE; $cfg['Servers'][$i]['auth_type'] = 'http'; 突变,您可能会期望updateBrand,并返回UpdateBrandInput个响应。请注意,输入不是UpdateBrandPayload,而是以BrandInput回复。您也不会使用标量布尔值(例如,如果成功,则为Brand)或已删除实体的true(在删除突变的情况下)。根据此约定,您可能会发生id突变,并发出createBrandCreateBrandInput响应。

通过创建特定于突变的CreateBrandPayloadinput类型,您可以在预期和响应的字段中获得很大的灵活性。每次删除,您可能会有一个payload响应,不仅包括品牌的浅层(例如,仅标量)字段,还包括其他相关数据(例如DeleteBrandPayload)等。

说实话,我认为GraphQL规范提供了足够的绳索让自己挂起来,所以看看一些大家伙是如何推动这一点的。

答案 1 :(得分:4)

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