如何使用 Rails 和 GraphQL 处理复杂的突变
Posted
技术标签:
【中文标题】如何使用 Rails 和 GraphQL 处理复杂的突变【英文标题】:How to handle complex mutations with Rails and GraphQL 【发布时间】:2020-10-20 06:30:09 【问题描述】:这部分是 GraphQL 问题,部分是 Rails 应用程序架构问题。
假设我正在创建一个公司博客,并且我有 3 个数据库模型:帖子、作者和标签。一个帖子有_many 个作者和标签,一个作者有_many 个帖子。所有关系都是多对多的。
我有一个类似这样的 graphql 请求:
mutation
createPost(
title: "foo"
description:"bar"
author:
name: "author1"
tags:
[content: "tag1"]
)
post
id
errors
这是我的突变。此代码适用于 post
创建,但我不确定如何创建关联记录。
module Mutations
class CreatePost < Mutations::BaseMutation
argument :title, String, required: true
argument :description, String, required: true
argument :author, [Types::AuthorInputType], required: false
argument :tags, [Types::TagInputType], required: false
field :post, Types::PostType, null: true
field :errors, [String], null: true
def resolve(title:, description:, author:, tags:)
post = Post.new(title: title, description: description)
# I want to find or create the tags and author here, and create any neccesary records and associations
# Should that be done here? If so, how? And if not, where would this logic live instead?
if post.save
post: post,
errors: [],
else
user: nil,
errors: post.errors.full_messages
end
end
end
end
【问题讨论】:
是的,这里......差不多,在if post.save
'success'块中......您可以加入相关数据以返回对象(可以作为结果查询) - 如果没有,它将被过滤出
【参考方案1】:
几个月前我实际上写过这个(以及更多):A Complete Guide to Setting up a GraphQL Server on Rails 。
这种组织代码的方法在我们的开源项目 - Pupilfirst 中非常适合我们。
【讨论】:
以上是关于如何使用 Rails 和 GraphQL 处理复杂的突变的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 中设置 GraphQL Relay API
Rails、Graphql、Apollo 客户端的 Auth Token 无效
graphql_devise 用于 Rails/Graphql/Apollo/React 中的身份验证。 “字段需要身份验证”错误