在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 :(得分: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)
这样的事情,那么你的问题突然变得不那么重复了。