You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GraphQL Ruby如何配置Enum使其支持查询时传入多个枚举值

实现方案

你可以根据你使用的graphql-ruby版本选择以下两种方案,都可以同时支持单枚举值和枚举数组传参:

方案1:自定义标量(兼容所有版本,使用最便捷)

这种方案前端传参无需调整格式,直接传status: "GOOD"或者status: ["GOOD", "NORMAL"]都可以正常解析,后端拿到的永远是统一的数组格式。

  1. 新增自定义标量文件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
  1. 修改你查询字段的参数定义,把原来的ItemStatus类型替换为上述自定义标量:
# 示例:你的查询字段定义
field :items, [Types::ItemType], null: false do
  argument :status, Graph::Scalars::ItemStatusOrList, required: false, description: "过滤商品状态"
end
  1. 对应的schema.graphql新增标量声明即可:
scalar ItemStatusOrList

# 你的查询字段参数使用该标量
type Query {
  items(status: ItemStatusOrList): [Item!]!
}

方案2:OneOf输入对象(符合GraphQL规范,类型安全性更高,需要graphql-ruby >= 2.0)

这种方案完全遵循GraphQL官方规范,类型校验更严格,但是前端传参格式需要做微小调整。

  1. 新增输入对象文件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
  1. 修改查询字段的参数定义:
field :items, [Types::ItemType], null: false do
  argument :status, Graph::Inputs::StatusFilter, required: false, description: "过滤商品状态"
end
  1. 对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:18:02