GraphQL Ruby如何配置Enum使其支持查询时传入多个枚举值
实现方案
你可以根据你使用的graphql-ruby版本选择以下两种方案,都可以同时支持单枚举值和枚举数组传参:
方案1:自定义标量(兼容所有版本,使用最便捷)
这种方案前端传参无需调整格式,直接传status: "GOOD"或者status: ["GOOD", "NORMAL"]都可以正常解析,后端拿到的永远是统一的数组格式。
- 新增自定义标量文件
app/graphql/graph/scalars/item_status_or_list.rb:
module Graph module Scalars class ItemStatusOrList < GraphQL::Schema::Scalar description "支持传入单个ItemStatus枚举或ItemStatus枚举数组" def self.coerce_input(value, ctx) case value when String unless Graph::Enums::ItemStatus.values.key?(value) raise GraphQL::CoercionError, "#{value} 不是合法的ItemStatus枚举值" end [value] when Array value.each do |item| unless Graph::Enums::ItemStatus.values.key?(item) raise GraphQL::CoercionError, "#{item} 不是合法的ItemStatus枚举值" end end value else raise GraphQL::CoercionError, "参数类型必须为ItemStatus枚举或枚举数组" end end def self.coerce_result(value, ctx) value end end end end
- 修改你查询字段的参数定义,把原来的
ItemStatus类型替换为上述自定义标量:
# 示例:你的查询字段定义 field :items, [Types::ItemType], null: false do argument :status, Graph::Scalars::ItemStatusOrList, required: false, description: "过滤商品状态" end
- 对应的
schema.graphql新增标量声明即可:
scalar ItemStatusOrList # 你的查询字段参数使用该标量 type Query { items(status: ItemStatusOrList): [Item!]! }
方案2:OneOf输入对象(符合GraphQL规范,类型安全性更高,需要graphql-ruby >= 2.0)
这种方案完全遵循GraphQL官方规范,类型校验更严格,但是前端传参格式需要做微小调整。
- 新增输入对象文件
app/graphql/graph/inputs/status_filter.rb:
module Graph module Inputs class StatusFilter < GraphQL::Schema::InputObject one_of # 声明为oneOf输入类型,每次只能传其中一个字段 argument :single, Graph::Enums::ItemStatus, required: true, description: "单个状态值" argument :multiple, [Graph::Enums::ItemStatus], required: true, description: "多个状态值数组" end end end
- 修改查询字段的参数定义:
field :items, [Types::ItemType], null: false do argument :status, Graph::Inputs::StatusFilter, required: false, description: "过滤商品状态" end
- 对应的
schema.graphql定义:
input StatusFilter @oneOf { single: ItemStatus multiple: [ItemStatus!] } type Query { items(status: StatusFilter): [Item!]! }
前端传参示例:
- 传单个状态:
status: { single: "GOOD" } - 传多个状态:
status: { multiple: ["GOOD", "NORMAL"] }
内容的提问来源于stack exchange,提问作者espeon
相关产品推荐
相关产品推荐

