Ruby on Rails,一次讲透对象之间的关联关系,永远忘不了

在之前的多篇文章中,我们学会了针对单个模型的数据库单表增删改查操作。很显然这种简单的逻辑是满足不了实际需要的。通常情况下,我们需要建立多个相互关联的对象,使用相互关联的表进行数据存储。

对于一个CMS系统来说,一篇文章可有多个标签。想要显示文章的标签,最原始的作法是:根据文章的id查询查询数据库得到文章对象后,根据其中存储的标签id列表,再进行一次数据库查询得到这文章拥有的所有标签对象。这种方式肯定是能够完成功能的,但这一定不是你想要的方式,因为实在是太麻烦了。你想要的是通过查询得到文章对象中,已经包含了引用的标签对象。没错,这正是级联操作能够提供给我们的,而且Rails也为此进行了封装,只要你定义好了模型之间关系,后面的事情忘掉吧

帮助我们完成这个工作的还是老朋友ActiveRecord,在之前学习的增删改查之外他还提供了级联操作的功能。下面从介绍对象之间的几种典型的关联关系入手,看看Rails如何发挥它的作用。

  • 一对一关联
  • 一对多关联
  • 多对多关联

举个例子来说,有一个学校,其中有若干个教室,每个教室分配了一老师师只在这一间教室上课。学生们一天要上不同的课程,需要在上完课后走到另一间教室中继续上其他科目

这个例子中教室和老师之间的关系就是典型的一对一关联。一般来说,我们用一种类似于拥有/属于的关系进行描述。教室has老师,老师belongs to教室。教室是父对象,老师是子对象。表之间的关系对象表,有外键,外键是父对象表的主键。这个例子中,如果定义为教室has老师,那么老师表中应该有一个外键字段,填写教室的id。你会说了,为什么不能说老师has教室,教室belongs to老师呢?其实对于一对一关联,谁包含谁都没什么问题

                                 

                                                     

                                                  

                                  

老师和所教授课程之间的关系是一对多关系。一个老师has多门课程,课程belongs to老师。老师应该是父对象,课程是子对象。作为一对一关联的更普通情况,仍然满足上面说对象表,有外键,外键是父对象表的主键这个原则。只不过在一对多关系中,子对象表中的多条记录外键值对应是父对象表的同一个主键。在这个例子中,课程表中有外键字段,有多门课程的外键是同一个老师的id。

                                                             

                        


学生和课程之间的关系是多对多关系每个学生要学多门课,每门课都有多个学生学习。一个课程has many学生belongs to many学生。一个学生has many课程,belongs to many课程。课程和学生同时作为父对象和子对象而存在。这种关系应该是一对多关系的更一般形式,我们用外键关系表示一下看看。Michael选修了AlgebraGeometry和Statistics课程,那么应该在课程表中将外键设置为Micael的id。Jennifer选修了AlgebraGeometry和Programming课程,这下糟了,课程表中的Geometry记录的外键已经设置为Michael的id了。替换肯定是不行的,难道需要增加列存放吗?如果有好多学生都选了这门课,岂不是要添加好多好多列来存放学生的id?

             

很显然这种方式肯定是行不通的需要引入第三张表来记录这种关系。这个表有两个有效列,课程id和学生id(表本身可能还有一个主键id,这个可以暂时无视。这么一来,相当于将一对多关系中的外键关系从列扩展拉伸至行扩展,解决了上面那种方式的问题。

          

                             

                             

对象之间的关联关系这下变得清清楚楚。总结一下

一对一:教室 has one 老师;老师 belongs to 教室

一对多:老师 has many 课程;课程 belongs to老师

多对多:学生has many 并且 belongs to many 课程

               课程 has many 并且 belongs to many 学生

这里的关系被Rails封装成如下的方法:

一对一:教室 has_one 老师;老师 belongs_to 教室

一对多:老师 has_many 课程;课程 belongs_to 老师

多对多:学生 has_and_belongs_to_many 课程

               课程 has_and_belongs_to_many学生

有了这个基础,接下来就要学习如何利用Rails帮助我们完成对象之间关系的操作。







评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值