代码之家  ›  专栏  ›  技术社区  ›  Vlad Hilko

在迭代中为服务对象缓存数据库查询的最佳方式是什么?

  •  0
  • Vlad Hilko  · 技术社区  · 6 年前

    我有一个rails服务对象——CarChecker和model AvailableCar:

    class CarChecker
      def car_is_available?(car)
        list_of_available_cars.include?(car)
      end
    
      def list_of_available_cars
        AvailableCar.all.map { ... }
      end
    end
    

    然后我检查控制器里的每辆车

    cars.each do |car|
      CarChecker.new().car_is_available?(car)
    end
    

    我如何避免发送请求 AvailableCar.all 每次迭代只发送一次?缓存此类行为的最佳方式是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   khelwood Muhammed Elsayed.radwan    6 年前

    您经常看到这样为缓存分配实例变量的方法。

    def list_of_available_cars
      @allcars ||= AvailableCar.all.map { ... }
    end
    

    第一次 list_of_available_cars 叫做, AvailableCars.all... 将被执行,结果存储在实例变量中。随后,将返回存储的值。

    为了让它以这种方式工作,您需要重用服务类的同一个实例。

    checker = CarChecker.new
    cars.each do |car|
      checker.car_is_available?(car)
    end
    

    如果必须使用 CarChecker 每次,您都可以使用类变量而不是实例变量(即使用 @@ 而不是 @ ):

    def list_of_available_cars
      @@allcars ||= AvailableCar.all.map { ... }
    end
    

    只要你 AvailableCar.all.map { ... } 总是会返回相同的结果,这应该很好。