Поле
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Мне было интересно, если это хорошая практика, или есть ли другие способы добиться такой оптимизации?