【问题标题】:How to write a graphQL mutation that allows for partial updates?如何编写允许部分更新的graphQL突变?
【发布时间】:2019-08-29 04:52:18
【问题描述】:

所以我正在努力为一个项目学习 GraphQL for ruby​​。

我几乎已经启动并运行了它的某些部分,但我遇到了其他部分的问题。有很多教程涵盖了超基础知识,但似乎都没有朝着正确的方向扩展。

我有一个突变来更新我的用户。到目前为止,一切都很好。我可以通过他们的 ID 来查找用户,并更新一个特定的字段。我可以将其扩展到更新两个字段。

不能做的,这看起来很疯狂,就是概括这些领域——根本就没有。我的用户模型最终会附加 20 多个字段——电话号码、地址、职位等。

当我创建突变时,我必须定义进入 resolve 方法的参数。到目前为止,一切都很好。然后我定义突变可以返回的字段。再说一次,到目前为止一切都很好。

然后我开始讨论实际的解析方法。

初始语法还不错。 def resolve(user_id:, name:, email:)。然后您会发现,尽管将 required 设置为 false,但您必须包含所有值。您需要为可选变量指定默认值。所以它变成了def resolve(user_id:, name: null, email: null)——但这实际上会消除这些值,你不能进行部分更新。更糟糕的是,想象一下您必须以这种方式设置 20 个字段。您可以通过尝试将参数转换为字典并拒绝 null 值来玩游戏——但如果属性需要再次为 nil,则不能将属性设置为 nil。

【问题讨论】:

    标签: ruby-on-rails graphql


    【解决方案1】:

    解决方案:双 splat 运算符。您的语法变为def resolve(user_id:, **args)。据我所知,它将所有剩余的命名参数变成了一个字典——我认为未命名的参数会变成一个数组。 不确定这两者混合会如何反应。

    完整模型变为:

      argument :user_id, ID, required: true#, loads: Types::UserType
      argument :name, String, required: false
      argument :email, String, required: false
    
      field :user, Types::UserType, null: true
      field :errors, Types::UserType, null: true
    
      def resolve(user_id:, **args)
        user = User.find(user_id)
        if user.update(args)
          {
            user: user,
            errors: []
          }
        else
          {
            user: nil,
            errors: user.errors.full_messages
          }
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 2023-03-05
      • 2019-05-22
      • 2010-10-30
      • 2021-08-23
      • 2019-04-10
      • 2021-12-02
      • 2022-01-07
      • 2019-05-24
      相关资源
      最近更新 更多