From 5fc02f00f80e1158c7823b72fd3c46fd15de54fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Geonizeli?= Date: Wed, 11 Aug 2021 21:45:15 -0300 Subject: [PATCH] fix balances query n+1 --- app/graphql/sources/active_record.rb | 18 ++++++++++++++++++ app/graphql/types/balance_type.rb | 6 +++++- app/graphql/x_stake_schema.rb | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 app/graphql/sources/active_record.rb diff --git a/app/graphql/sources/active_record.rb b/app/graphql/sources/active_record.rb new file mode 100644 index 0000000..09e008a --- /dev/null +++ b/app/graphql/sources/active_record.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Sources + class ActiveRecord < GraphQL::Dataloader::Source + # rubocop:disable Lint/MissingSuper + def initialize(model_class) + @model_class = model_class + end + + def fetch(ids) + @model_class + .where(id: ids) + .index_by(&:id) + .slice(*ids) + .values + end + end +end diff --git a/app/graphql/types/balance_type.rb b/app/graphql/types/balance_type.rb index f1a3e09..8af921f 100644 --- a/app/graphql/types/balance_type.rb +++ b/app/graphql/types/balance_type.rb @@ -7,7 +7,11 @@ module Types graphql_name "Balance" field :id, ID, null: false - field :currency, CurrencyType, null: false field :amount, String, null: false + + field :currency, CurrencyType, null: false + def currency + dataloader.with(Sources::ActiveRecord, Currency).load(object.currency_id) + end end end diff --git a/app/graphql/x_stake_schema.rb b/app/graphql/x_stake_schema.rb index b89bdee..8e5f10d 100644 --- a/app/graphql/x_stake_schema.rb +++ b/app/graphql/x_stake_schema.rb @@ -2,6 +2,7 @@ class XStakeSchema < GraphQL::Schema # mutation(Types::MutationType) query(Types::QueryType) + use GraphQL::Dataloader def self.resolve_type(abstract_type, obj, ctx) case obj