我使用的是Ruby on Rails 7,我的ApplicationController中有很多helper_method
s(见下面的代码),其中一些需要相对繁重的数据处理才能执行,例如,因为它们出于安全原因检查复杂的参数输入数据。
class ApplicationController < ActionController::Base
helper_method :param_heavy_processing
helper_method :param_medium_processing
helper_method :param_light_processing
// ...
private
def param_heavy_processing
return nil unless params[:param_heavy].present?
// heavy data processing e.g. many iterations
end
def param_medium_processing
return nil unless params[:param_medium].present?
// medium data processing
end
def param_light_processing
return nil unless params[:param_light].present?
// light data processing
end
// ...
end
在我的视图和控制器中,我很少调用这些方法,在许多情况下,在请求流中不止一次。通过登录它们,似乎每次我调用一个助手方法,然后该方法的数据处理都是由scratch执行的(一次又一次,每次调用一次),这对长期运行的性能不利。
因此,我想以某种方式“缓存”整个控制器动作流的这些方法的第一次调用的结果,以便每个请求只执行一次数据处理。这可能吗?如果可能,如何实现?
1条答案
按热度按时间mwg9r5ms1#
当您只想在当前请求的持续时间内缓存方法的结果时,最常见的模式如下所示:
这将在第一次调用时将 * 繁重的数据处理 * 的结果存储在示例变量中。下次调用该方法时,示例变量已经设置,立即返回,并且不会重新计算该块。
在下一个请求中,将创建控制器的新示例,因此示例变量中该高速缓存将消失,需要重新生成。
值得注意的是,当繁重的计算可能返回
nil
或false
时,此模式不起作用。然后您将需要更复杂的模式。