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

