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

如何在GraphQL-ruby中定义存储嵌套数组结构的自定义数据类型?

GraphQL-ruby 数组类型字段实现方案

你当前的写法无法匹配实际数据结构,投入使用会报错:你定义的[[Types::AssetType]]是「对象数组的数组」,但原始数据的子项是无字段标识的二元组,GraphQL-ruby无法自动完成数组到AssetType对象的映射。
根据你的需求可以选择以下两种实现方案:

方案一:转成对象类型(推荐,符合GraphQL设计规范)

这种方案把原始二元组转成带明确字段的AssetType对象,类型安全度高,客户端查询时可以明确指定要返回的字段。

代码实现

module Types
  class PerformanceDataType < Types::BaseObject
    # 注意类型是一维的AssetType数组,不需要嵌套两层
    field :assets, [Types::AssetType], null: false

    # 新增resolver方法做数据转换
    def assets
      # object为当前PerformanceDataType对应的数据源,假设其assets属性就是你给出的二维数组
      object.assets.map do |date, value|
        { date: date, value: value }
      end
    end
  end
end

module Types
  class AssetType < Types::BaseObject
    field :date, String, null: false
    field :value, Float, null: false
  end
end

客户端查询示例

query getPerformance {
  performanceData {
    assets {
      date
      value
    }
  }
}

方案二:直接匹配二元组结构

如果不需要拆解字段,想要直接返回原始数组结构,可以用自定义标量实现,不需要额外做数据转换。

代码实现

首先自定义二元组标量做类型校验:

module Types
  class DateValueTupleType < GraphQL::Schema::Scalar
    description "格式为[日期字符串, 数值]的二元组"

    def self.coerce_input(value, ctx)
      unless value.is_a?(Array) && value.size == 2 && value[0].is_a?(String) && value[1].is_a?(Numeric)
        raise GraphQL::CoercionError, "不符合[日期字符串, 数值]的二元组格式"
      end
      value
    end

    def self.coerce_result(value, ctx)
      value.to_a
    end
  end
end

然后在字段中引用:

module Types
  class PerformanceDataType < Types::BaseObject
    field :assets, [Types::DateValueTupleType], null: false
  end
end

如果不需要严格的类型校验,也可以直接用内置的JSON类型快速实现:

field :assets, [[GraphQL::Types::JSON]], null: false

内容的提问来源于stack exchange,提问作者Flip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 23:09:02