精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-26
最后修改:2008-12-26
我在 http://github.com/courtenay/altered_beast/tree/master/config/initializers/concerns.rb看到一个很好的简单的方法: 建立RAILS_ROOT/config/initializers/concerns.rb文件 class << ActiveRecord::Base def concerned_with(*concerns) concerns.each do |concern| require_dependency "#{name.underscore}/#{concern}" end end end 现在Model就有了一个concerned_with方法,例如在User这个Model中,我们可以将validation和一些业务方法分开来管理: RAILS_ROOT/app/models/user.rb class User < ActiveRecord::Base concerned_with :validations, :service end 现在建立RAILS_ROOT/app/models/user/validations.rb文件: class User < ActiveRecord::Base validates_presence_of :name end RAILS_ROOT/app/models/user/service.rb class User < ActiveRecord::Base def self.authenticate(name, password) find_by_name_and_password(name, password) end end 这以上只是一个很小的例子而已. 面对这样,是不是感觉很舒服呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-26
class Ticket < ActiveRecord::Base include Submitable end class Ticket class Submitable def submit(host) end end end 其实和现在很多的 plugin 一样的实现方法,比如 acts_as_taggable ,将 tag 的功能混入 model,所以并不觉得这种方法有什么新鲜。 另外,楼主文不对题,你的代码根本就不是在说怎么组织 Model,而是怎么组织一个 Model 的不同功能 |
|
返回顶楼 | |
发表时间:2008-12-27
楼主的这个例子好,利用ruby的meta program特性,直接打开class的mata class,往里面塞入方法...这样组织代码的确巧妙
这样的技巧被大量的用在plugin和rails框架本身,但是如果大家都是作应用的,我反对这样用,反而hozaka的方法值得推荐,因为声明依赖是显示的,这样比较kiss 作类库和作应用不一样,如果是作应用,越少技巧越好... |
|
返回顶楼 | |
发表时间:2008-12-27
http://m.onkey.org/2008/9/15/active-record-tips-and-tricks
|
|
返回顶楼 | |
发表时间:2008-12-27
很有必要,肥model是rails这种无dao,无service框架的一个固有问题,应该有好的组织办法来组织代码,使之有良好的粒度,方便开发和代码管理。
|
|
返回顶楼 | |
发表时间:2009-01-09
方法不错..
|
|
返回顶楼 | |
发表时间:2009-01-09
或许部分方法并不完全扔给model,controller也可以承担部分责任,肥model是rails这种无dao,无service框架的一个固有问题,这虽然是rails的小缺陷,但是如果真把这2层给加上去,那么rails和传统的java框架是不是又走近了?
|
|
返回顶楼 | |
发表时间:2009-01-09
最后修改:2009-01-09
如果Model大到一定程序,我会用这个方法进行分割
把Associations和Validations放Model本身,对外的Service放一个 |
|
返回顶楼 | |
发表时间:2009-01-10
如果只想把validation和service分开,一般普通的mixin就可以了,而且很简单直白。
楼主的方法和一般mixin相比,似乎唯一好处是可以分块来写测试——但这样又说明功能划分似乎有问题——是不是该写成两个model了? 所以感觉concerned_with还是没什么价值。 jiachengxi38 写道 或许部分方法并不完全扔给model,controller也可以承担部分责任,肥model是rails这种无dao,无service框架的一个固有问题,这虽然是rails的小缺陷,但是如果真把这2层给加上去,那么rails和传统的java框架是不是又走近了?
如果觉得要有dao,那就写一个dao,如果觉得要有一个service,那就写一个service。 |
|
返回顶楼 | |
发表时间:2009-01-11
@hozaka
按照你这样的方法,model这个文件行数还是很大啊 |
|
返回顶楼 | |