如何使用 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 处理复杂的突变的主要内容,如果未能解决你的问题,请参考以下文章

如何批处理 GitHub GraphQL API 查询?

如何在 Rails 中设置 GraphQL Relay API

Rails、Graphql、Apollo 客户端的 Auth Token 无效

graphql_devise 用于 Rails/Graphql/Apollo/React 中的身份验证。 “字段需要身份验证”错误

在GraphQL / Rails中如何在query_type中传递参数?

无法将 GraphQL 查询从 Apollo 客户端发送到 Rails GraphQL 后端