【问题标题】:How to reload initializer for each record update如何为每个记录更新重新加载初始化程序
【发布时间】:2014-07-20 11:51:07
【问题描述】:

在我的应用程序中,我使用了一个在 config/initializers/details.rb 中定义的全局变量

$available_plans= Plan.all

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

所以 after_create 添加了一个方法来重新加载初始化器,

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

这是正确的方法吗?

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于代码审查的。应该在 codereview.stackexchange.com 上询问

标签: ruby-on-rails reload initializer


【解决方案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

【讨论】:

  • 嗨 Tamer,我可以按照这种方式进行操作,但是如果我想在全局变量中获取计划详细信息 ($user_plan = current_user.plan_deails) 是否正确?
  • 其实在Rails中使用全局变量并不方便。我认为您不应该将全局变量用于计划详细信息,仅当前用户需要它,不是吗?
  • 是的,但是,为了避免在每个活动中调用它来设置权限,如果我将其设置为全局,我可以使用它
【解决方案2】:

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

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

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

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

现在您可以像这样在整个代码中访问您的计划:

Plan.available_plans

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

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

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.available_plans 时,它将获取(并缓存)一个新列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多