论坛首页 编程语言技术论坛

将Rails中的一个Model按功能拆分 进行管理

浏览 6410 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-26   最后修改:2008-12-26
在开发Rails应用中,随着业务的扩大,Model中的代码量越来越大,(本来在Rails中也是说瘦Controller,胖Model,不是吗?),上百上千行代码也是很常见的,所以很有必要将单个Model将照不同的作用分开,这样代码维护性也好。
我在 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

这以上只是一个很小的例子而已.

面对这样,是不是感觉很舒服呢?
   发表时间: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 的不同功能
0 请登录后投票
   发表时间:2008-12-27  
楼主的这个例子好,利用ruby的meta program特性,直接打开class的mata class,往里面塞入方法...这样组织代码的确巧妙
这样的技巧被大量的用在plugin和rails框架本身,但是如果大家都是作应用的,我反对这样用,反而hozaka的方法值得推荐,因为声明依赖是显示的,这样比较kiss

作类库和作应用不一样,如果是作应用,越少技巧越好...
0 请登录后投票
   发表时间:2008-12-27  
http://m.onkey.org/2008/9/15/active-record-tips-and-tricks
0 请登录后投票
   发表时间:2008-12-27  
很有必要,肥model是rails这种无dao,无service框架的一个固有问题,应该有好的组织办法来组织代码,使之有良好的粒度,方便开发和代码管理。
0 请登录后投票
   发表时间:2009-01-09  
方法不错..
0 请登录后投票
   发表时间:2009-01-09  
或许部分方法并不完全扔给model,controller也可以承担部分责任,肥model是rails这种无dao,无service框架的一个固有问题,这虽然是rails的小缺陷,但是如果真把这2层给加上去,那么rails和传统的java框架是不是又走近了?
0 请登录后投票
   发表时间:2009-01-09   最后修改:2009-01-09
如果Model大到一定程序,我会用这个方法进行分割
把Associations和Validations放Model本身,对外的Service放一个
0 请登录后投票
   发表时间: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。
0 请登录后投票
   发表时间:2009-01-11  
@hozaka
按照你这样的方法,model这个文件行数还是很大啊
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics