在我的应用程序中,我使用的是一个在config / initializers / details.rb
中定义的全局变量$available_plans= Plan.all
并在整个应用程序中使用此变量,这将对所有用户可用。如果我再添加一个计划,那应该自动反映,所以我需要重新加载初始化程序
所以after_create添加了一个重新加载初始化程序的方法,
ActiveSupport::Dependencies.load_file "config/initializers/details.rb"
这是正确的方法吗?
答案 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时,它将获取(并缓存)一个新的列表。