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')  

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

idtypeusernamepasswordemailstudent_namestudent_noteacher_nameteacher_departmententerprise_addressenterprise_zip
1Studentyuyijq123456yuyijq#hotmail.comYuYi03041317    

再看看这样的代码

  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一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值