浏览 9250 次
锁定老帖子 主题:用block简化编程一例
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-15
在ruby中自己调用memcache-client对费时的查询进行缓存,也就是自己实现的简单的查询缓存: if RAILS_ENV == 'test' @top_topic = TopTopic.get_topic elsif @top_topic = Cache.get("TopTopic.get_topic") Cache.put("TopTopic.get_topic",@top_topic, 60*30) if @top_topic = TopTopic.get_topic end 先判断是否测试环境,如果测试环境,就略过缓存,直接读取数据库,如果不是测试环境,那么先取缓存,如果缓存里面有,就返回,如果缓存里面没有,去查询数据库,查询数据库后,再判断是否查出来结果,如果没有结果就不填充缓存,如果有结果,就填充缓存。 逻辑够复杂的,好在ruby语法够简洁,几行就搞定了,但饶是如此,每个QueryCache都这么写,就太难看了,也不符合DRY原则,于是抽象出来一个QueryCache类: class QueryCache # Usage: QueryCache.get(key, timeout) { Model.find_method} def self.get(key, timeout = 60* 30) return value = yield if RAILS_ENV == 'test' unless value = Cache.get(key) Cache.put(key, value, timeout) if value = yield end value end end 于是所有的查询缓存可以简化为一行代码: QueryCache.get("TopTopic.get_topic", 60*30) { TopTopic.get_topic } 这样查询缓存写起来就容易多了,完全屏蔽了复杂的逻辑判断,只要传cache的key,timeout和实际查询语句三个参数就搞定了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-15
没看懂。不过参数里面是 "TopTopic.get_topic",block里面是 TopTopic.get_topic,似乎不需要block,对参数用个 eval 就好了吧?
|
|
返回顶楼 | |
发表时间:2007-02-16
aardvark 写道 没看懂。不过参数里面是 "TopTopic.get_topic",block里面是 TopTopic.get_topic,似乎不需要block,对参数用个 eval 就好了吧?
eval也可以,用block是特地为了操练的目的。 |
|
返回顶楼 | |