1

场地

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

4

0 回答 0