Rails:向模型添加其他方法以进行缓存检索

时间:2011-09-27 23:14:53

标签: ruby-on-rails ruby caching activerecord redis

在Rails中向模型添加缓存时,重复性质如下所示:

class Team < ActiveRecord::Base
  attr_accessible :name
end

Before caching, to retrieve a name, everything was trivial,

team = Team.new(:name => "The Awesome Team")
team.save

team.name # "The Awesome Team"

使用memcached或redis引入缓存后,我发现自己在模型中添加了方法,而且重复性很高:

def get_name
  if name_is_in_cache
    return cached_name
  else
    name
  end
end

def set_name(name)
  # set name in cache
  self.name = name
end

我是否有一些明显的方法可以清除它?我以不同的方式缓存了很多字段,而且attr_accessible在这一点上几乎是多余的。如何清理?

1 个答案:

答案 0 :(得分:2)

创建一个仅在instance_eval周围提供包装的mixin。未测试的:

module AttributeCaching
  def cache(name)
    instance_eval(<<-RUBY)
      def get_#{name}
        if #{name}_is_in_cache
          return cached_#{name}
        else
          #{name}
        end
      end
    RUBY

    instance_eval(<<-RUBY)
      def set_#{name}(name) 
        self.#{name} = name
      end
    RUBY
  end
end

然后在你的模型中:

class Team < ActiveRecord::Base
  extend AttributeCaching

  cache :name
  cache :something_else
end

但是,通过不以不同方式命名每种缓存方法,您可能会使您的生活变得更轻松。你不能做get_cached(name)set_cached(name, value)这样的事情,那么你的问题突然变得不那么重复了。