场地
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 还很陌生,我一直想知道这是否是一种好习惯,或者是否有其他方法可以实现这种优化?