2011-09-27 97 views
1

当添加缓存,从而在Rails的模型,还有就是重复性质,看起来像下面这样: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在这一点上实际上是多余的。这怎么可以清理?

+0

您可以添加一些强制您使用缓存的复杂/性能密集型方法的示例吗? – James

回答

2

创建一个mixin,只为instance_eval提供包装。未经测试:

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)这样做,那么你的问题突然变得不那么重复。

+0

我应该在我原来的问题中更具体。这确实回答了这个问题。然而,像Redis这样的工具,有不同的数据类型和不同的方式来添加/删除这些类型。在这种情况下,上面的抽象会失败。有了这个说法,你的确按照原来的要求回答了问题,我为此感谢你。 – randombits