ruby-on-rails 如何“缓存”控制器帮助器方法的结果?

eyh26e7m  于 2023-04-08  发布在  Ruby
关注(0)|答案(1)|浏览(143)

我使用的是Ruby on Rails 7,我的ApplicationController中有很多helper_methods(见下面的代码),其中一些需要相对繁重的数据处理才能执行,例如,因为它们出于安全原因检查复杂的参数输入数据。

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执行的(一次又一次,每次调用一次),这对长期运行的性能不利。
因此,我想以某种方式“缓存”整个控制器动作流的这些方法的第一次调用的结果,以便每个请求只执行一次数据处理。这可能吗?如果可能,如何实现?

mwg9r5ms

mwg9r5ms1#

当您只想在当前请求的持续时间内缓存方法的结果时,最常见的模式如下所示:

def param_heavy_processing
  return if params[:param_heavy].blank?
  
  @param_heavy_processing ||= begin
    # heavy data processing e.g. many iterations
  end
end

这将在第一次调用时将 * 繁重的数据处理 * 的结果存储在示例变量中。下次调用该方法时,示例变量已经设置,立即返回,并且不会重新计算该块。
在下一个请求中,将创建控制器的新示例,因此示例变量中该高速缓存将消失,需要重新生成。
值得注意的是,当繁重的计算可能返回nilfalse时,此模式不起作用。然后您将需要更复杂的模式。

相关问题