У меня есть следующие настройки:
class Product < ApplicationRecord
has_many :variants
end
class Variant < ApplicationRecord
belongs_to :product
end
Types::QueryType = GraphQL::ObjectType.define do
connection :products, Types::ProductType.connection_type do
resolve -> (obj, _, _) do
Product.all.includes(:variants)
end
end
end
Types::ProductType = GraphQL::ObjectType.define do
connection :variants, Types::VariantType.connection_type do
resolve -> (obj, _, _) { obj.variants }
end
end
И выполнение следующего запроса:
{
products {
edges {
nodes {
variants {
edges {
node {
id
}
}
}
}
}
}
}
создает следующие запросы SQL:
Product Load (2.7ms) SELECT "products".* FROM "products" LIMIT $1 [["LIMIT", 25]]
Variant Load (8.6ms) SELECT "variants".* FROM "variants" WHERE "variants"."product_id" IN (1, 2, 3)
Variant Load (19.0ms) SELECT "variants".* FROM "variants" WHERE "variants"."product_id" = $1 LIMIT $2 [["product_id", 1], ["LIMIT", 25]]
Variant Load (13.6ms) SELECT "variants".* FROM "variants" WHERE "variants"."product_id" = $1 LIMIT $2 [["product_id", 2], ["LIMIT", 25]]
Variant Load (2.4ms) SELECT "variants".* FROM "variants" WHERE "variants"."product_id" = $1 LIMIT $2 [["product_id", 3], ["LIMIT", 25]]
Как мы можемсм. в выводе sql, includes
работает, но graphql все равно и делает n + 1 в любом случае.Это нормальное поведение, и я вынужден использовать такие решения, как graphql-batch, чтобы исправить это, или что-то не так с моими настройками?Насколько я видел по всему интернету, использования includes
должно быть достаточно для такого простого сценария, и graphql должен использовать нетерпеливо загруженные данные вместо получения n + 1.Я что-то здесь не так сделал?
Я на графике 1.7.9
.