假设我有一个返回用户列表的控制器.如果缓存键存在,则从memcache返回用户,否则命中mysql db.此逻辑将在Web服务层或其他内容中重复使用.
行动:
def list
if in cache
@userlist = ...
else
@userlist = User.all()
end
end
Run Code Online (Sandbox Code Playgroud)
在Java世界中,您将创建一个UserService层,它将包装其他逻辑(如首先检查缓存层等).
在rails中,人们倾向于将所有这些逻辑放在控制器中.
这里的Rails'最佳实践'是什么?
Nic*_*nry 15
在Rails社区中似乎存在一个"小"运动,以在某些项目/应用程序中建立服务层.2010年,我参与了一个项目,我们引入了一个应用程序/服务目录来存储服务对象.我们发现应用程序逻辑分布在控制器和模型中,这有助于封装这种行为.James Golick在这个主题上有一篇有趣的帖子.查看Pat Maddox的评论:
http://jamesgolick.com/2010/3/14/crazy-heretical-and-awesome-the-way-i-write-rails-apps.html
"Rails方式"是:瘦控制器,胖模型.
您只需更改模型以支持缓存:
class User < ActiveRecord::Base
def self.all
@cached[:all] ||= super
end
end
Run Code Online (Sandbox Code Playgroud)
或者创建一个注入器以支持多个模型所需的缓存:
class User < ActiveRecord::Base
include CacheInjector
end
Run Code Online (Sandbox Code Playgroud)
请记住:Ruby作为一种动态语言,很容易扩展.Mixins,拦截器,方面,所有那些用Java实现的PITA,在Ruby上非常容易和自然.试试看.