如何在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
相关产品推荐
相关产品推荐

