我想从数据库只加载一次集合,所以我不需要在每个请求上执行它或将它存储在缓存中。
我可以在Rails 3中执行此操作吗?在应用程序启动周期中的某一点?
此外,如何通过网站提供此收藏品?
答案 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