`
yuyijq
  • 浏览: 6676 次
社区版块
存档分类
最新评论

rails中用单表继承处理OO中的继承树

阅读更多

正在用rails作一个项目,在处理会员的时候遇到这样的情况。

本系统有普通会员、学生会员、教师会员、企业会员、系统管理员,各个会员有共同的属性也有自己特有的属性,是一个明显的继承关系。开始我是这样作的:

建立一个用户表users,这个表存储各种类别会员公有属性:username,password,email
然后建立students,teachers,enterprises等表,这些表里保存各会员特有的属性,然后这些表里用user_id与users表相关联,这是一个常规的数据库设计,但是在程序上处理起来却很麻烦,弄几个表,而且以后如果再多一种会员类型那是不是还要建立一个表呢?
终于发现了rails里面的单表继承:rails里的单表继承将继承体系里的所有类都映射到一个表,所有类的属性都保存在一个表里面,还有一个名字为type(又是一个约定)用于保存当前的这条记录对应的对象是属于哪个类型,那看看我所遇到的问题怎样用单表继承来解决呢:

继承体系的代码
  1. #表名users   
  2. class User < ActiveRecord::Base   
  3. end  
  4.   
  5. class Student < User   
  6. end  
  7.   
  8. class Teacher < User   
  9. end  
  10.   
  11. class Enterprise < User   
  12. end  

加入公有字段为username,password,email
Student有 student_name,student_no
Teacher有teacher_name,teacher_department
Enterprise有enterprise_address,enterprise_zip

那我们怎么设计数据库呢?

列名 备注
id  
type 约定
username 公有,用户名
password 密码
email 邮件
student_name 学生姓名
student_no 学号
teacher_name 教师姓名
teacher_department 部门
enterprise_address 企业地址
enterprise_zip 邮编

Ok,现在我们来执行这样一个代码

  1. Student.create(:name => 'yuyijq',:password => '123456',:email => 'yuyijq@hotmail.com',:   
  2.   :student_name => 'YuYi',:student_no => '03041317')  

执行后我们的数据库应该是怎样的一个情况呢?

id type username password email student_name student_no teacher_name teacher_department enterprise_address enterprise_zip
1 Student yuyijq 123456 yuyijq#hotmail.com YuYi 03041317        

再看看这样的代码

  1. #用他们的父类去查询   
  2. user = User.find(1)   
  3. #my_type结果是Student呢   
  4. my_type = user.class    

ActiveRecord会自动的去查找type这个字段,然后根据这个字段来创建对应类型的对象(好智能啊)。

从上面可以看出:
第一:除非这个字段是所有对象都公有的,那么其他字段应该设置为“可为空”,不然就要抛异常了啊
第二:看看我的student,teacher等的属性名字是不是太长了,这是因为用单表继承的时候不能使用相同名字的属性,不然谁分的清楚啊
第三:我在插入Student对象的时候也给teacher_name赋值一下,那这个Student对象不也有了teacher_name属性吗?赫赫,自己try一下

分享到:
评论
2 楼 yuyijq 2007-07-11  
哦,我这里仅仅为了说明单表继承,没有考虑到数据库设计的合理性~~Sorry!
1 楼 blackanger 2007-07-06  
username和studentname不一样吗?感觉很牵强的分离出来不同的属性,什么studentname和teatchername其实是可以合并成公有的吧

相关推荐

    actions_as_relation:rails的多表继承

    默认情况下,ActiveRecord仅支持单表继承(STI)。 MTI为您提供了STI的好处,但不必在单个表中放置数十个空字段。 以传统的电子商务应用程序为例...产品具有共同的属性( name , price , image等),而每种类型...

    rails指南 中文版

    1. **ActiveRecord**:这是Rails框架中的ORM(Object-Relational Mapping)组件,它负责处理数据库操作。通过ActiveRecord,开发者可以使用面向对象的方式来操作数据,而无需编写SQL语句。 2. **ActionController**...

    使用Aptana+Rails开发Rails Web应用(中文)

    安装过程中,遵循提示进行,确保选择自定义安装并勾选Rails相关的插件,以便在Aptana中获得对Rails的全面支持。 安装完成后,打开Aptana Studio,创建一个新的Rails项目。在“File”菜单中选择“New”然后点击...

    Ruby on Rails:Rails中的表单处理.docx

    Ruby on Rails:Rails中的表单处理.docx

    Ruby on Rails中文指南

    在Ruby on Rails中文指南中,你将全面学习到如何利用这个强大的框架来构建动态的、数据驱动的Web应用程序。 首先,让我们深入理解Rails的核心概念: 1. **路由(Routes)**:Rails的路由系统是应用程序的导航蓝图...

    Rails项目源代码

    这个Rails项目提供了学习和研究Web开发的机会,特别是对于Ruby on Rails新手,可以通过阅读和理解源代码来提升技能,了解实际应用中Rails的用法。同时,对于有经验的开发者,这个项目也可以作为一个起点,进行二次...

    Rails101_by_rails4.0

    此外,书中还介绍了一些Rails中的高级概念,如Strong Parameters(强参数),它在Rails 4.0版本中引入,用于解决之前版本中的参数篡改问题,从而帮助开发者安全地处理外部提交的数据。 通过一系列的教学内容,包括...

    Rails的中文乱码问题

    标题中的“Rails的中文乱码问题”涉及到的是在使用Ruby on Rails框架开发Web应用时,遇到的中文字符编码不正确的问题。Rails是一个基于Ruby语言的开源Web开发框架,它遵循MVC(Model-View-Controller)架构模式。在...

    中文版rails教程

    ActiveRecord是Rails的ORM系统,它将数据库表与Ruby类绑定,通过ActiveRecord对象操作数据。 2. **视图(View)**:视图负责呈现用户界面,通常由HTML、CSS和JavaScript组成。Rails的 erb(嵌入式Ruby)模板允许...

    railsAPI

    在Rails API中,模型(Model)代表应用程序的数据结构,它与数据库交互,处理数据验证和业务逻辑。视图(View)是用户看到和与之交互的部分,而控制器(Controller)作为模型和视图之间的协调者,处理用户请求并决定...

    rails本地安装包完整版

    7. **activerecord-2.1.0.gem**:ActiveRecord是Rails中的ORM(对象关系映射)库,负责将数据库表映射为Ruby类,使得开发者可以通过面向对象的方式来操作数据库,而无需编写SQL语句。 这个本地安装包特别适合网络...

    Rails 中mongrel的安装

    Rails是Ruby on Rails框架的简称,它是一种基于Ruby语言的开源Web开发框架,以其MVC(Model-View-Controller)架构而闻名,旨在简化Web应用的开发过程。在早期的Rails版本中,Mongrel是一个常用的HTTP服务器,用于...

    Ruby on Rails入门例子

    在Rails中,我们通常使用ActiveRecord库来创建模型,通过继承`ApplicationRecord`类并定义属性和关系。 2. **View**:视图负责展示用户界面。Rails提供了ERB(Embedded Ruby)模板,允许在HTML中嵌入Ruby代码,实现...

    Rails3-使用ajax处理并发

    标题 "Rails3-使用ajax处理并发" 涉及的是在Ruby on Rails 3框架中如何利用Ajax技术处理并发请求。Rails是一个流行的Web应用程序开发框架,它基于Ruby语言,而Ajax(Asynchronous JavaScript and XML)则是一种允许...

    关于rails 3.1 cucumber-rails 1.2.0

    Asset Pipeline优化了前端资源的处理,Cucumber-Rails则提供了强大的测试工具,确保代码的质量和功能符合业务需求。这样的组合对于保持代码的整洁、提高团队协作效率和降低维护成本具有重要意义。 总的来说,了解和...

    rails敏捷开发的购物车系统

    在本文中,我们将深入探讨如何使用Rails敏捷开发技术构建一个购物车系统,特别是在参考《rails敏捷开发第四版》中的示例。Rails 3.2.6是本文的基础框架,它是一个强大的Ruby Web应用程序框架,以其MVC(模型-视图-...

    Rails

    标题 "Rails" 指的是 Ruby on Rails,一个开源的Web应用程序框架,它基于Ruby编程语言,遵循MVC(模型-视图-控制器)架构模式。Rails由David Heinemeier Hansson在2004年创建,其设计理念是强调代码的简洁性、DRY...

    rails向导打包

    4. **Rails 数据库迁移(Migrations)**: Migrations 是 Rails 中用于数据库结构版本控制的工具。它们允许开发者以编程方式添加、修改或删除表列,而不必直接操作 SQL。文件将涵盖创建、运行和回滚迁移,以及使用 `...

Global site tag (gtag.js) - Google Analytics