我有一个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
而仅发送一次?缓存此类行为的最佳方法是什么?
答案 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 { ... }
总是返回相同的结果,那应该没事。