存储包含模型集合的全局变量

时间:2016-07-29 20:27:37

标签: ruby-on-rails

我想存储一个全局变量,所以每次引用模型时都不会访问数据库。

我应该在初始化程序中执行此操作还是以其他方式执行此操作?

$rules = Rule.all

除非我更改代码库,否则此数据永远不会更改,因此只有在应用重新加载时才能刷新。

我有哪些选择?

我想我也可以在我的控制器中执行此操作:

$rules ||= Rule.all

有关于此的“最佳做法”吗?

3 个答案:

答案 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"),
                                      ...
                                     ]