如何在Ruby on Rails和GraphQL mutations中实现字符串唯一约束
问题原因
graphql-ruby 的 field 配置本身没有内置 unique 关键字参数,唯一性约束不属于GraphQL类型系统的原生职责——类型系统仅负责校验字段类型、非空等基础schema规则,字段值唯一性需要在数据层、业务逻辑层单独实现。
实现方案
方案1:数据层加约束(最稳妥,兜底防止重复数据)
如果你是基于Rails等框架开发,优先在数据库加唯一索引,同时在模型层加校验:- 生成数据库迁移文件添加唯一索引:
# 迁移文件内容 add_index :people, :name, unique: true- 在Person模型中添加唯一性校验:
class Person < ApplicationRecord validates :name, uniqueness: true end方案2:Mutation 业务层校验(提前拦截错误,返回友好提示)
在对应创建/更新Person的Mutation逻辑中,先校验传入的name是否已存在,存在则直接返回错误:module Mutations class CreatePerson < Mutations::BaseMutation argument :name, String, required: true field :person, Types::PersonType, null: true field :errors, [String], null: false def resolve(name:) # 提前校验唯一性 if Person.exists?(name: name) return { person: nil, errors: ["名称已存在,请输入唯一的name值"] } end person = Person.new(name: name) if person.save { person: person, errors: [] } else { person: nil, errors: person.errors.full_messages } end end end end方案3:自定义可复用校验规则(适合多场景需要相同唯一校验的情况)
可以封装通用的唯一性校验方法,或者自定义graphql-ruby的参数验证器,在所有需要校验name唯一的Mutation中直接引用,避免重复写判断逻辑。
内容的提问来源于stack exchange,提问作者Sean Payne
相关产品推荐
相关产品推荐

