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

时间:2019-01-14 14:51:37

标签: ruby-on-rails ruby database activerecord

我有一个rails服务对象-CarChecker和模型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 个答案:

答案 0 :(得分:1)

您经常会看到这样分配给实例变量进行缓存的方法。

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 { ... }总是返回相同的结果,那应该没事。