Как предотвратить n + 1 запрос отношения «многие ко многим» в rails graphql? - PullRequest
0 голосов
/ 31 октября 2019

Я делаю запрос в graphql, не выполняя запрос n + 1 в каркасных рельсах

Это для совместного использования базы данных, чтобы реагирующий веб-упаковщик получил доступ к информации.

У меня естьисключено n + 1 запросов в отношениях один к одному и один ко многим с гемом пакетного загрузчика

один ко многим

BatchLoader.for(user.id).batch(default_value: []) do |user_ids, loader|
  Comment.where(user_id: user_ids).each do |comment|
    loader.call(comment.user_id) { |memo| memo << comment }
  end
end

один к одному

BatchLoader.for(post.user_id).batch do  |user_ids, loader|
  User.where(id: user_ids).each { |user| loader.call(user.id, user) }
end

Поскольку отношение «многие ко многим» не распространяется на вышеприведенные случаи, я пробовал gem Shopify / graphql-batch, и его работа или результат не очень хорошо работали с «один ко многим»отношения

class Physician < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ApplicationRecord
  belongs_to :physician
  belongs_to :patient
end

class Patient < ApplicationRecord
  has_many :appointments
  has_many :physicians, through: :appointments
end

В этом примере схемы я хочу получить врачей от пациента

1 Ответ

0 голосов
/ 06 ноября 2019

Ответ на ваш вопрос правильный здесь, в этом видео . Несколько недель назад мне тоже было любопытно, а потом я наткнулся на это видео.

Проблема и причина, по которой у вас есть n + 1 запрос с graphql, согласно видео, состоит в том, что вы все еще пытаетесь запросить БД, как если бы вы использовали обычный REST API, где некоторые из этих запросовкак было сделано для вас самим graphql, так что написание кода для них приводит к двойному / множественному запросу

Не торопитесь, чтобы посмотреть выступление, вы можете найти там большинство ответов, которые вы ищете.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...