2011-09-27 60 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