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

GraphQL-Ruby查询能否返回多个字段?Rails GraphQL API实现问询

解决方案:自定义GraphQL对象类型实现多字段返回

在Rails的GraphQL中,单个查询要返回多个不同类型的数据,不能直接返回基础类型,需要先定义自定义对象类型,把需要返回的字段都封装进去,再让查询返回这个对象类型即可。

1. 创建自定义返回类型

在app/graphql/types/目录下新建lobby_users_result_type.rb,定义包含users和user_count的对象类型:

module Types
  class LobbyUsersResultType < Types::BaseObject
    field :users, [Types::UserType], null: false, description: "大厅中的用户列表"
    field :user_count, Integer, null: false, description: "大厅中的用户数量"
  end
end

2. 修改查询类,返回自定义类型

更新你的FetchLobbyCount查询类,替换返回类型为自定义的LobbyUsersResultType,并在resolve方法中返回包含两个字段的哈希:

module Queries
  class FetchLobbyCount < Queries::BaseQuery
    graphql_name "FetchLobbyCount"

    argument :user_id, Integer, required: false

    # 替换为自定义返回类型
    type Types::LobbyUsersResultType, null: false

    def resolve(user_id:)
      @user = User.find_by(id: user_id) # 用find_by避免抛出ActiveRecord异常,统一处理错误

      unless @user.present?
        return GraphQL::ExecutionError.new("Cannot find user with id: #{user_id}")
      end

      # 查询目标用户集合
      lobby_users = User.where(awaiting_match: true).where.not(id: user_id)
      
      # 返回与自定义类型字段匹配的哈希
      {
        users: lobby_users,
        user_count: lobby_users.count
      }
    end
  end
end

3. 发起查询示例

现在可以通过以下GraphQL查询,同时获取用户列表和数量:

query FetchLobbyCount($userId: Integer) {
  fetchLobbyCount(userId: $userId) {
    users {
      id
      name
      # 其他UserType定义的字段
    }
    userCount
  }
}

返回结果结构符合预期:

{
  "data": {
    "fetchLobbyCount": {
      "users": [
        {"id": 2, "name": "UserA"},
        {"id": 3, "name": "UserB"}
      ],
      "userCount": 2
    }
  }
}

注意事项

  • 自定义对象类型需继承项目中的BaseObject(通常为Types::BaseObject)
  • resolve返回的哈希键名要和自定义类型的字段名完全匹配(GraphQL会自动将Ruby下划线命名转为驼峰命名,如user_count对应查询中的userCount)
  • 用find_by替代find可避免因用户不存在抛出异常,统一通过GraphQL的ExecutionError返回错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:40:01