在开发Rails应用中,随着业务的扩大,Model中的代码量越来越大,(本来在Rails中也是说瘦Controller,胖Model,不是吗?),上百上千行代码也是很常见的,所以很有必要将单个Model将照不同的作用分开,这样代码维护性也好。
我在 [url]http://github.com/courtenay/altered_beast/tree/master/config/initializers/concerns.rb[/url]看到一个很好的简单的方法:
建立[b]RAILS_ROOT/config/initializers/concerns.rb[/b]文件
现在Model就有了一个[color=blue]concerned_with[/color]方法,例如在User这个Model中,我们可以将validation和一些业务方法分开来管理:
[b]RAILS_ROOT/app/models/user.rb[/b]
现在建立[b]RAILS_ROOT/app/models/user/validations.rb[/b]文件:
[b]RAILS_ROOT/app/models/user/service.rb[/b]
这以上只是一个很小的例子而已.
面对这样,是不是感觉很舒服呢?
我在 [url]http://github.com/courtenay/altered_beast/tree/master/config/initializers/concerns.rb[/url]看到一个很好的简单的方法:
建立[b]RAILS_ROOT/config/initializers/concerns.rb[/b]文件
class << ActiveRecord::Base
def concerned_with(*concerns)
concerns.each do |concern|
require_dependency "#{name.underscore}/#{concern}"
end
end
end
现在Model就有了一个[color=blue]concerned_with[/color]方法,例如在User这个Model中,我们可以将validation和一些业务方法分开来管理:
[b]RAILS_ROOT/app/models/user.rb[/b]
class User < ActiveRecord::Base
concerned_with :validations, :service
end
现在建立[b]RAILS_ROOT/app/models/user/validations.rb[/b]文件:
class User < ActiveRecord::Base
validates_presence_of :name
end
[b]RAILS_ROOT/app/models/user/service.rb[/b]
class User < ActiveRecord::Base
def self.authenticate(name, password)
find_by_name_and_password(name, password)
end
end
这以上只是一个很小的例子而已.
面对这样,是不是感觉很舒服呢?