Rails + Graphql: Как оптимизировать SQL-запрос перед выполнением схемы graphqls для результата? - PullRequest
0 голосов
/ 03 февраля 2019

Поле

module Types
  class QueryType < GraphQL::Schema::Object
      field :restaurants, [RestaurantType], null: true do
        description "Lists all restaurants"
      end

      def restaurants
        Restaurant.all
      end
    end
  end

Запрос

query Restaurants {
  restaurants {
    name
    cuisine
  }
}

В приведенном выше примере Restaurants.all первоначально получит все строки изтаблицу restaurant, а затем отфильтровывать их в соответствии с запросом.

Это довольно неэффективно, поскольку мы можем использовать запрос для фильтрации наших данных по фактическому запросу sql:

module Types
  class QueryType < GraphQL::Schema::Object
    field :restaurant, RestaurantType, null: true do
      description "Find a restaurant by ID"
      argument :id, Int, required: true
    end

    field :restaurants, [RestaurantType], null: true, resolve: -> (obj, args, ctx) {
                                        children = ctx.irep_node.scoped_children
                                        root_key = children.keys.first
                                        params = children[root_key].keys
                                        Restaurant.all.select(params.join(", "))
                                      } do
      description "Lists all restaurants"
    end
  end
end

Подчеркнутое представление sql тогда равно

Опция A SELECT "restaurants".* FROM "restaurants" - возвращает больше строк, чем необходимо

Опция B SELECT name, cuisine FROM "restaurants" - только возвратзапрошенные строки

Это не идеально, так как он не будет работать с объединениями, если явно не обработан.

Поскольку я довольно новичок в Ruby и / или RailsМне было интересно, если это хорошая практика, или есть ли другие способы добиться такой оптимизации?

...