使用Rails的范围(Scope)和GraphQL::Batch::Loader时需要注意的事项

使用Rails时使用GraphQL::Batch::Loader的注意事项。

請幫我解釋這個問題。

尽管引入了GraphQL::Batch::Loader来避免N + 1问题,但是仍然未能解决该问题。

GraphQL::Batch::Loader是为了解决N + 1问题而创建的一个类。在以下链接中可以找到有关模式配置的更多信息:
https://github.com/Shopify/graphql-batch#schema-configuration

导致这种情况的原因是什么?

造成这个问题的原因是在GraphQL::Batch::Loader的for参数中传递了一个活动记录范围(ActiveRecord::Relation)。

在GraphQL::Batch::Loader中,如果for参数相同,将进行批量加载。

「同じ」というのは、正確には、ハッシュのキーとして一致するということを意味します。
由于ActiveRecord::Relation没有被实现成可以用作哈希键的形式,所以实际上即使看起来相同,也不可能在哈希中作为键相匹配。

因此,它不被视为相同并且无法进行批量加载。

解决方案

为了能够将ActiveRecord::Relation用作哈希的键,我应用了以下的猴子补丁。

module ActiveRecord
  class Relation
    def hash
      to_sql.hash
    end

    def eql?(other)
      self == other
    end
  end
end

似乎也考虑过使用Rails来实现,但却被搁置了。https://github.com/rails/rails/pull/33638

bannerAds