Lazy-load model class variable hash


I have a number of models which contain almost static data. I don't
to hit to db when accessing a row, nor do I want to hit memcached.

I am hoping to use a lazy-loaded model class variable hash. This will
ensure that the db is hit only once for the life of a mongrel process.

Are there any drawbacks to this solution? Can the code be simplified?

well it's very minor, but you can write
@@hash_by_name = Status.find(:all).index_by(&:name)

I've used a similar pattern quite a lot and as far as I can tell it
works fine. If you are going to be using it in a lot of methods, then
you can wrap it up a little, i've got something like

module Caches
   module ClassMethod
     def caches(name, &block)
       define_method(name) do
         ivar_name = "cache_#{name}_value"
         unless value = instance_variable_get ivar_name
           value = instance_eval(&block)
           instance_variable_set ivar_name, value
   def self.included(base)
     base.extend ClassMethods
(written off the top of my head in mail, expect typos).

You can then do something like

class Status ...
   class << self
     include Caches
     caches('all') {Status.find(:all).index_by(&:name)}
     caches('something_else') { ...code to compute something else...}


Thanks Frederick, with your help I've reduced the code to:

class Status < ActiveRecord::Base
  def self.hash_by_name
    @@hash_by_name ||= self.find(:all).index_by(&:name)

I'll use the helper method if I use this a lot in the future.