从db加载一次集合,在整个站点中使用

时间:2011-03-07 19:47:23

标签: ruby-on-rails

我想从数据库只加载一次集合,所以我不需要在每个请求上执行它或将它存储在缓存中。

我可以在Rails 3中执行此操作吗?在应用程序启动周期中的某一点?

此外,如何通过网站提供此收藏品?

4 个答案:

答案 0 :(得分:1)

在config / initializers / constants.rb中,

你可以这样做:

SECTOR_NAMES = Sector.all.collect {| sector | sector.name}

和SECTOR_NAMES将是整个应用中的常量

答案 1 :(得分:1)

拥有一个缓存的类方法可能很简单。这种事情对于下拉列表的内容很方便,这些列表很少变化,它和静态一样好:

class Country
  def self.cached_list
    @cached_list ||= self.all
  end
end

请记住,类实例变量将在类本身的生命周期内持续存在。在开发环境中,这是一个请求,但在生产中,这是对同一进程的所有请求。

答案 2 :(得分:0)

您可以将其存储在其中一个模型的类变量中。

class User < ActiveRecord::Base
  cattr_reader :special
  @@special = User.where(:special => true).all
  ...
end

如果您启用了类缓存,那么它将仅在Rails启动期间进行评估(这是生产环境的默认设置)。

答案 3 :(得分:0)

我使用以下内容:

module ReferenceData
  def self.included(model)
    model.instance_eval do
      def self.find_by_sql(*args)
        sql = args.first
        ReferenceDataCache.get(sql) || ReferenceDataCache.put(sql, super)
      end
    end
  end
end

class ReferenceDataCache
  @@cache = {}
  def self.find_by_sql(*args)
    sql = args.first
    ReferenceDataCache.get(sql) || ReferenceDataCache.put(sql, super)
  end

  def self.put(sql, obj)
    Rails.logger.info "[Caching Reference Data Query] #{sql}"
    @@cache[sql] = obj unless obj.empty?
    return obj
  end

  def self.get(sql)
    if @@cache.has_key?(sql)
      return @@cache[sql]
    end
    nil
  end
end

然后,您可以通过执行以下操作使任何类成为引用数据类:

class Cities < AR:B
  include ReferenceData
end