我想存储一个全局变量,所以每次引用模型时都不会访问数据库。
我应该在初始化程序中执行此操作还是以其他方式执行此操作?
$rules = Rule.all
除非我更改代码库,否则此数据永远不会更改,因此只有在应用重新加载时才能刷新。
我有哪些选择?
我想我也可以在我的控制器中执行此操作:
$rules ||= Rule.all
有关于此的“最佳做法”吗?
答案 0 :(得分:1)
好的,然后在config/initializers/
目录中创建一个像load_rules.rb
这样的文件。在里面,写下类似的东西:
ActiveSupport.on_load(:active_record) do
RULES = Rule.all
end
现在在您想要使用的任何地方使用此常量。
答案 1 :(得分:1)
我建议使用包含在方法中的低级缓存:
class ApplicationCotroller < ActionController::Base
# ...
def all_rules
Rails.cache.fetch("all_rules") do
Rule.all
end
end
# ...
end
根据您的使用案例,该方法可以放在单个类而不是ApplicationController
中,也可以放在mixin Module
中。
此方法的主要好处是,您可以轻松地重新加载规则,而无需通过从控制台删除缓存键来重新启动服务器。虽然你清楚地将其标记为非关键方面,但我认为它增加了一些便利性。
答案 2 :(得分:0)
我认为您不想将数据库用于此类事情。您应该将这些值存储为对象数组,并使用Rails.app.config.x
命名空间:
所以你的模型看起来像:
#app/models/rule.rb
class Rule
attr_reader :name
def initialize(name:)
@name = name
end
end
和您的初始化程序:
# config/initializers/rules_initializer.rb
Rails.application.config.x.rules = [
Rule.new(name: "Admin"),
...
]