正在用rails作一个项目,在处理会员的时候遇到这样的情况。
本系统有普通会员、学生会员、教师会员、企业会员、系统管理员,各个会员有共同的属性也有自己特有的属性,是一个明显的继承关系。开始我是这样作的:
建立一个用户表users,这个表存储各种类别会员公有属性:username,password,email
然后建立students,teachers,enterprises等表,这些表里保存各会员特有的属性,然后这些表里用user_id与users表相关联,这是一个常规的数据库设计,但是在程序上处理起来却很麻烦,弄几个表,而且以后如果再多一种会员类型那是不是还要建立一个表呢?
终于发现了rails里面的单表继承:rails里的单表继承将继承体系里的所有类都映射到一个表,所有类的属性都保存在一个表里面,还有一个名字为type(又是一个约定)用于保存当前的这条记录对应的对象是属于哪个类型,那看看我所遇到的问题怎样用单表继承来解决呢:
继承体系的代码
-
- class User < ActiveRecord::Base
- end
-
- class Student < User
- end
-
- class Teacher < User
- end
-
- class Enterprise < User
- 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,现在我们来执行这样一个代码
- Student.create(:name => 'yuyijq',:password => '123456',:email => 'yuyijq@hotmail.com',:
- :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 |
|
|
|
|
再看看这样的代码
-
- user = User.find(1)
-
- my_type = user.class
ActiveRecord会自动的去查找type这个字段,然后根据这个字段来创建对应类型的对象(好智能啊)。
从上面可以看出:
第一:除非这个字段是所有对象都公有的,那么其他字段应该设置为“可为空”,不然就要抛异常了啊
第二:看看我的student,teacher等的属性名字是不是太长了,这是因为用单表继承的时候不能使用相同名字的属性,不然谁分的清楚啊
第三:我在插入Student对象的时候也给teacher_name赋值一下,那这个Student对象不也有了teacher_name属性吗?赫赫,自己try一下
分享到:
相关推荐
默认情况下,ActiveRecord仅支持单表继承(STI)。 MTI为您提供了STI的好处,但不必在单个表中放置数十个空字段。 以传统的电子商务应用程序为例...产品具有共同的属性( name , price , image等),而每种类型...
Ruby on Rails中文指南
使用Aptana+Rails开发Rails Web应用 有Aptana的安装配置等等,中文
rails指南 中文版
Simple Form - 轻松处理Rails表单
nestive, 一个更好的Rails 嵌套可以继承布局插件 Nestive 用于 Rails的嵌套布局帮助器Nestive为你的Rails 应用程序添加强大的布局和视图助手。 它类似于嵌套布局技术,已经在 Rails 指南中记录,并且在许多其他嵌套...
rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails ...
《Rails之道》详细讨论了Rails的程序代码并通过分析Rails中的代码片段来深入解释它的功能,同时,《Rails之道》部分章节也摘录了一些API文档中的内容,使读者能够快速地找到对应的API文档、相关的示例代码以及深入...
Ruby On Rails中文教材(PDF)
Rails Security Checklist:社区驱动的Rails安全检查表
在过去的几年中,《Ruby on Rails Tutorial》这本书被视为介绍使用 Rails 进行 Web 开发的先驱者。 在这个全球互联的世界中,计算机编程和 Web 应用程序开发都在迅猛发展,我很期待能为中国的开发者提供 Ruby on ...
本资源是参照rails敏捷开发第四版书中的例子,rails的版本是rails3.2.6
Ruby On rails依赖的目录树
jquery-datatables-rails, 用于 Rails的jquery数据表 gem jquery-datatables-rails 这个 gem 为 jQuery DataTables插件提供了方便,以便与 Rails 资产pipleine结合使用。 它提供所有基本的datatable文件,以及一些...
中文世界唯一一本Rails 4.0.0 + Ruby 2.0.0 的自學書籍
敏捷Rails中文教程 敏捷Rails中文教程 敏捷Rails中文教程
rails-assets, 在 Rails 中,资产管理的解决 Rails 资产 Bundler 到 Bower 代理本自述文件涉及项目的开发方面。 访问站点了解如何在你的应用程序中使用 Rails 资产。 插件开发设置git clone git@github.com:tenex/r
rails-settings, 使用 Ruby on Rails 管理设置 Rails的设置 ruby gem,通过在单独的数据库表中将它们存储为序列化的哈希来处理。 包含命名空间和默认值。要求ruby 1.9.3或者更高版本Rails 3.1或者更高版本( 包括 ...
ruby_on_rails_3_入门教程(中文)