`

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

阅读更多
在开发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

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

面对这样,是不是感觉很舒服呢?
分享到:
评论
11 楼 yangzhihuan 2009-01-13  
典型的open class

hozaka兄的方法好用,显示声明了,简单明了。

至于
wakuwaku 写道
@hozaka
按照你这样的方法,model这个文件行数还是很大啊


如果你觉得model文件行数大的话,可以把validate这样的方法放到另外的rb文件里,只要你加载就可以了
比如:
module Validate
  def validate
    #code
  end
end


在user.rb里面加上
require 'validate'
include Validate

这样就可以啦。
10 楼 wakuwaku 2009-01-11  
@jiachengxi38
胖model,瘦controller完全就是一个实践问题,
理想情况controller只需要完成2个任务
1)把获取的数据发给model处理
2)确定得到的数据以什么格式发出去

交警就是交警,指挥交通才是主要任务,当然扶老太太过马路也不是说不行。总不能影响正事对不对 :)

9 楼 wakuwaku 2009-01-11  
@hozaka
按照你这样的方法,model这个文件行数还是很大啊
8 楼 night_stalker 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。
7 楼 Raecoo 2009-01-09  
如果Model大到一定程序,我会用这个方法进行分割
把Associations和Validations放Model本身,对外的Service放一个
6 楼 jiachengxi38 2009-01-09  
或许部分方法并不完全扔给model,controller也可以承担部分责任,肥model是rails这种无dao,无service框架的一个固有问题,这虽然是rails的小缺陷,但是如果真把这2层给加上去,那么rails和传统的java框架是不是又走近了?
5 楼 klfo 2009-01-09  
方法不错..
4 楼 seemoon 2008-12-27  
很有必要,肥model是rails这种无dao,无service框架的一个固有问题,应该有好的组织办法来组织代码,使之有良好的粒度,方便开发和代码管理。
3 楼 wosmvp 2008-12-27  
http://m.onkey.org/2008/9/15/active-record-tips-and-tricks
2 楼 lgn21st 2008-12-27  
楼主的这个例子好,利用ruby的meta program特性,直接打开class的mata class,往里面塞入方法...这样组织代码的确巧妙
这样的技巧被大量的用在plugin和rails框架本身,但是如果大家都是作应用的,我反对这样用,反而hozaka的方法值得推荐,因为声明依赖是显示的,这样比较kiss

作类库和作应用不一样,如果是作应用,越少技巧越好...
1 楼 hozaka 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 的不同功能

相关推荐

    Ruby-Rails实战之B2C商城开发

    在本项目"Ruby-Rails实战之B2C商城开发"中,我们将深入探索使用Ruby on Rails这一强大的Web开发框架来构建一个完整的B2C(Business-to-Consumer)在线商城。Rails是Ruby语言的一个核心框架,以其MVC(Model-View-...

    splitcheck:此Ruby on Rails应用程序是一个网站,用于讨论餐厅是否允许拆分支票。 它具有投票,评论和收藏夹功能

    本文将深入探讨一个名为"splitcheck"的Ruby on Rails应用程序,它是一个专门针对餐厅是否允许拆分支票的在线讨论平台。该应用旨在提供一个互动社区,让用户分享他们的经验,发表意见,并通过投票来表达对特定餐厅的...

    blood-app-app:带有React前端的Rails API后端-进行中

    【标题】:“blood-app-app:带有React前端的Rails API后端-进行中”指的是一个正在开发中的项目,该项目结合了React前端技术和Ruby on Rails(Rails)API后端,旨在创建一个用于管理血压数据的应用程序。...

    spine.rails3:演示Spine和Rails集成的示例应用程序

    本篇文章将深入探讨如何在Rails 3项目中集成Spine.js,以创建一个高效、响应式的前端。 **一、Spine.js简介** 1. **核心概念**:Spine.js的核心组件包括Model、Controller、View和Event Bus。Model负责数据处理,...

    rails_ionic_min:IONIC Icons缩小了GEM

    标题中的“rails_ionic_min:IONIC Icons缩小了GEM”指的是一个针对Rails框架的Gem,它专门用于集成和优化IONIC图标库。IONIC Icons是一个包含大量图标资源的库,广泛应用于移动应用开发,尤其是基于IONIC框架的应用...

    Book_Air:这是预订机票的应用程序。 它是由React&Redux构建的。 它的后端(在另一个仓库中)是使用Ruby on Rails构建的API

    开发者可以通过查看这些文件,学习如何在实际项目中集成React、Redux和Rails,以及如何设计和实现一个完整的预订系统。 总结起来,Book_Air应用展示了React和Redux在构建用户交互丰富的前端应用中的强大能力,同时...

    onelogApp:onelog 的 UI,使用 React 和 Reflux,访问 rails API

    标题中的“onelogApp:onelog 的 UI,使用 React 和 Reflux,访问 rails API”揭示了这个项目是一个基于React和Reflux构建的日志应用用户界面,它与后端Rails API进行交互。下面将详细阐述React、Reflux以及Rails API...

    my-apartment-tracker:完整的CRUD React in Rails应用程序可用于跟踪公寓

    这个项目展示了如何将前端的React框架与后端的Ruby on Rails框架相结合,以构建一个功能齐全的Web应用。 【描述】"我的公寓追踪器" 提供了一个全面的解决方案,用于管理和记录公寓相关数据。通过React,用户界面...

    tastemaker:Rails, JavaScript - 初创企业的电子商务原型

    在构建初创企业的电子商务原型时,"tastemaker:Rails, JavaScript"项目是一个很好的起点,它融合了Ruby on Rails(简称Rails)的后端框架和JavaScript的前端技术,为初学者和有经验的开发者提供了一个实战性的学习...

    JavaScript实现的漂亮的基于MooTools 框架的边栏平滑菜单效果demo

    MooTools是一个轻量级且功能丰富的JavaScript库,它的设计灵感来源于Ruby on Rails,旨在提供一种更加优雅和模块化的编程方式。 在"JavaScript实现的漂亮的基于MooTools 框架的边栏平滑菜单效果demo"中,我们可以...

    MVCMVC架构模式

    3. **易于维护**:修改一个部分不会影响其他部分,降低了维护成本。 4. **可重用性**:视图和模型可以复用,减少重复代码。 5. **扩展性**:随着需求变化,可以通过添加新的控制器和视图来扩展功能,而无需修改原有...

    web后端高级开发.zip

    例如,Spring Boot对于Java开发者来说是一个强大的框架,提供自动配置、依赖注入等功能;Python的Django则以其MVT(Model-View-Template)设计模式简化了开发流程。 三、数据库管理 数据库是存储和管理数据的关键...

    购物

    在本项目中,"购物"指的是一个名为ShoppAWatch的电子商务应用,它结合了Ruby on Rails后端技术和React前端框架来提供流畅的在线购物体验。让我们深入探讨这两个核心技术及其在构建电商应用中的作用。 首先,Ruby on...

    Web架构设计的演进

    微服务架构提倡将单一应用拆分为多个小型、独立的服务,每个服务都有自己的数据库和业务逻辑。这使得服务可以独立部署、扩展和升级,增强了系统的灵活性和可扩展性。例如,Netflix和Uber等公司广泛应用微服务架构。 ...

    后端编程开发-第8篇.pptx

    - **微服务架构**:将单个应用程序拆分成一组小的服务,每个服务都实现了特定的功能,并且能够独立部署、扩展。 - **事件驱动架构**:这种架构依赖于事件的发布和订阅机制,使得各个组件之间能够松耦合,提高了系统...

    helium:用于Laravel的实验性CMS软件包

    氦气CMS是Laravel生态系统中的一个创新尝试,为开发者提供了一个在Laravel框架下构建内容管理系统的便捷途径。尽管作为实验性项目,其稳定性和成熟度可能有待提高,但无疑为开发者提供了探索和学习的机会,也推动了...

    Ruby Web Application Framework-开源

    Ruby Web Application Framework,通常指的是Ruby on Rails(RoR),它是一个使用Ruby编程语言构建的开源web应用框架。这个框架遵循MVC(Model-View-Controller)架构模式,旨在提高开发效率,强调“约定优于配置”...

    Detectinator-crx插件

    Rails,全称为Ruby on Rails,是一个基于Ruby语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。Rails强调“约定优于配置”,推崇DRY(Don't Repeat Yourself)原则,以提高开发效率。它包含了一...

    软件系统体系结构:各种系统使用的体系结构描述的集合

    这些组件可以是服务、模块、库或应用程序,它们通过接口连接,形成一个功能完备的系统。例如,Node.js和React常用于构建前后端分离的Web应用,JavaScript作为它们共同的语言基础,负责处理客户端和服务器端的逻辑。 ...

    mvcgithub28.github.io:投资组合网站

    可能有一个主SCSS文件(如`style.scss`),以及按功能或组件拆分的多个部分(如`header.scss`, `footer.scss`, `button.scss`等)。 3. **JavaScript文件**:可能包含实现交互和动态功能的脚本,例如响应式导航、...

Global site tag (gtag.js) - Google Analytics