使用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