Разрыв связи включает в себя - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть следующие настройки:

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

.

1 Ответ

0 голосов
/ 04 февраля 2019

Я только что получил ответ на средство отслеживания ошибок graphql-ruby:

Привет, я заметил, что LIMIT 25 применяется к этим запросам.Вы знаете, где это применяется?Если вы хотите использовать результат из исходного запроса, вы должны удалить предложение LIMIT.(Я предполагаю, что если вы спросите .limit (25), ActiveRecord не будет использовать кэшированное отношение.) Может быть, у вас есть default_max_page_size?Что произойдет, если вы удалите его?

Итак, короче говоря, я удалил конфигурацию default_max_page_size из своей схемы, и это решило проблему.

...