首页 > 解决方案 > Rails GQL 加载器返回子值

问题描述

我正在尝试将字段中的父 ID 传递到解析器加载程序,并且使用加载程序我想加载父 [ids] 的所有子代,但我可以在控制台中看到哈希,但它没有返回任何内容。

field :posts, PostGQLCoreType do
    description "posts of users"

    resolve ->(user, _args, _ctx) { PostLoader.load(user.id) }
    
  end

以及我认为存在错误的加载程序代码

class PostLoader < GraphQL::Batch::Loader
  def perform(ids)
    
    posts = Post.where(user_id: ids).index_by(&:id)
    
    ids.each { |id| fulfill(id.to_i, posts[id]) }
    
  end
end

在控制台中我看到了这个返回,但在 gqp API 中什么也没有

[primary] User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."user_input" = 'f' /*application:app,controller:core,action:create,line:(eval):41:in `block in exec_query'*/  [["user_input", false]]
  [primary] Post Load (0.3ms)  SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN ('e78fe073-e2f6-44ab-83aa-957a46913bfc', 'e76bf46c-59f4-4819-8d72-6811a36ed2cc', '4399436f-2710-412b-9cc4-043b33d8b0cf', '374b2895-2fe0-4bfb-850f-36803c3461bc', '63cc613a-260a-4a06-8b7b-167ca40310b6', 'fbf196f2-dd96-43e6-b421-46f5fcbd4c2b', '0e64e251-8f79-4ce1-acef-bebb5bbce2a0', '6be9abcf-5d57-477c-9133-7771fe82ae2c', '3fdfe90b-a794-4eae-b77e-bf87c1b40151', 'cb4d82f5-d159-41d9-bba7-9525788ffd9c') /*application:app,controller:core,action:create,line:(eval):41:in `block in exec_query'*/
Completed 200 OK in 883ms (Views: 0.3ms | ActiveRecord: 36.7ms)

API 返回是

"users": [
      {
        "id": "e21fe073-e2f6-44ab-83aa-957a46913bfc",
        "code": "customerservice",
        "posts": null
      },
      {
        "id": "a25bf46c-59f4-4819-8d72-6811a36ed2cc",
        "code": "facilities",
        "posts": null
      },

标签: ruby-on-railsgraphql

解决方案


通过这种方法修复它

仅当父数据库中存在 @childmodel_id 名称时才会返回

posts = Post.where(user_id: ids).index_by(&:id)

如果父数据库没有@childmodel_id 并且在子数据库中有@parentmodel_id 那么我们必须采用这种方法

posts = Post.where(user_id: ids).group_by(&:user_id)

推荐阅读