如何为每个记录更新重新加载初始化程序

时间:2014-05-30 16:32:32

标签: ruby-on-rails reload initializer

在我的应用程序中,我使用的是一个在config / initializers / details.rb

中定义的全局变量
$available_plans= Plan.all

并在整个应用程序中使用此变量,这将对所有用户可用。如果我再添加一个计划,那应该自动反映,所以我需要重新加载初始化程序

所以after_create添加了一个重新加载初始化程序的方法,

ActiveSupport::Dependencies.load_file "config/initializers/details.rb"

这是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

为什么不:

class Plan < ActiveRecord::Base
  after_create: custom_method

  # Whatever code      

  private
  def custom_method
    $available_plans= Plan.all
  end
end

此外,当编辑应该反映在全局变量中的计划时,我们应该使用after_save代替:

class Plan < ActiveRecord::Base
  after_save: custom_method

  # Whatever code      

  private
  def custom_method
    $available_plans= Plan.all
  end
end

答案 1 :(得分:1)

另一种处理方法是完全放弃初始化程序和全局变量。在我看来,这更加本地化和清洁。

首先,在您的Plan类中,添加一个缓存方法来访问所有计划:

def self.available_plans
    @available_plans ||= Plan.all
end

注意:这可以使用cached_method gem进行改进,这样可以让您跨应用实例等缓存计划......如果这对您很重要。

现在,您可以在整个代码中访问您的计划,如下所示:

Plan.available_plans

第一次在app实例中调用它时,将加载计划。此后每次都会返回原始结果。

最后,当添加,删除或修改计划时(再次,在您的计划模型中):

after_save :expire_cached_available_plans
after_destroy :expire_cached_available_plans

...

private
def expire_cached_available_plans
   self.class.instance_variable_set("@available_plans", nil)
end

现在,无论何时创建,更新或销毁Plan对象,都将清除缓存的计划。下次调用Plan.available_plans时,它将获取(并缓存)一个新的列表。