Rails + Graphql: Как оптимизировать SQL-запрос перед выполнением схемы graphqls для результата?
поле
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 тогда
Вариант АSELECT "restaurants".* FROM "restaurants"
- возвращает больше строк, чем необходимо
Вариант БSELECT name, cuisine FROM "restaurants"
- возвращает только запрошенные строки
Это не идеально, так как оно не будет работать с объединениями, если не обработано явно.
Поскольку я довольно новичок в Ruby и / или Rails, мне было интересно, хорошая ли это практика, или есть ли другие способы добиться такой оптимизации?