所以我正在努力尝试为项目中的红宝石学习GraphQL。
我几乎已经启动并运行了其中的某些部分,但是其他部分存在问题。那里有很多涵盖超基础知识的教程,但是似乎都没有朝着正确的方向扩展。
我有一个更新用户的版本。到目前为止,一切都很好。我可以通过用户ID查找用户,并更新单个特定字段。我可以将其扩展为更新两个字段。
我无法做,这看上去很疯狂,却将这些字段概括化了。我的用户模型将附加20多个字段,包括电话号码,地址,职务等。
创建突变时,必须定义resolve方法中的参数。到目前为止,一切都很好。然后,我定义突变可以返回的字段。再次,到目前为止一切都很好。
然后我了解实际的解决方法。
初始语法还不错。 def resolve(user_id:, name:, email:)
。然后,您发现尽管需要将设置设置为false,但您仍必须包括所有值。您需要为可选变量指定默认值。这样就变成了def resolve(user_id:, name: null, email: null)
-但这实际上使这些值无效,因此您无法进行部分更新。更糟糕的是,想象一下必须以这种方式设置20个字段。您可以通过尝试将参数转换为字典并拒绝空值来玩游戏-但是,如果属性需要再次为nil,则无法将其设置为nil。
答案 0 :(得分:0)
解决方案:双重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