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
答案 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
突变,并发出createBrand
和CreateBrandInput
响应。
通过创建特定于突变的CreateBrandPayload
和input
类型,您可以在预期和响应的字段中获得很大的灵活性。每次删除,您可能会有一个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/