在上一篇文章中,我们知道通过has_one和belongs_to方法定义一对一关联关系。接下来是更常见的情况,一对多关联。
比如老师与所教课程的关系,一个老师负责多个课程。换成对象之间的关系就是:一个老师has may课程,课程belongs to老师。

和一对一关联的相似之处是

  • 关联关系也是通过外键建立的。
  • 子对象都会拥有一个父对象的引用,使用belongs_to表示与父对象的关系。

不同之处是

  • 一个父对象对应多个子对象而不是只对应一个。所以需要在父对象中改用has_many引用子对象。
  • 由于has_may个子对象,所以在书写类定义的时候要用复数,这也是符合语言习惯的。
  • 获取子对象的方法不再返回单个子对象,而是返回子对象的列表。方法名字也是复数。

用例子说话,创建一个课程(Course)模型定义

  1. rails g model Course name:string teacher_id:integer

生成了迁移任务,其中teacher_id是指向teachers表的外键。

  1. #创建课程表的迁移任务
  2. class CreateCourses < ActiveRecord::Migration
  3. def change
  4. create_table :courses do |t|
  5. t.string :name
  6. t.integer :teacher_id
  7. t.timestamps
  8. end
  9. end
  10. end

修改Teacherl类,增加一个has_many :courses的声明。和一对一关联类似在Course类定义中增加belongs_to :teacher的声明,建立指向Tacher的引用。

  1. #Teacher类定义
  2. class Teacher < ActiveRecord::Base
  3. belongs_to :class_room
  4. has_many :courses
  5. attr_accessible :class_room_id, :name
  6. end
  7. #Course类定义
  8. class Course < ActiveRecord::Base
  9. belongs_to :teacher
  10. attr_accessible :name, :teacher_id
  11. end

创建两个课程对象。

  1. > course_geometry = Course.create(:name=>'Geometry')
  2. > course_algebra = Course.create(:name=>'Algebra')

由于在类定义中建立了引用关联,对象可以进行适用于这些关联关系的方法调用。比如说取得引用的对象列表使用teacher.courses方法,注意方法名字是复数。

  1. > teacher = Teacher.find(1)
  2. > teacher.courses
  3. => []

teacher还没有与course进行关联,可以先取得引用对象列表在通过<<向courses列表中添加

  1. > teacher.courses<<course_geometry
  2. => [#<Course id: 1, name: "Geometry", teacher_id: 1, created_at: "2012-12-09 05:15:33", updated_at: "2012-12-09 05:22:04">]

除此之外还有其他方法可用

    1. #直接指定所有引用
    2. teacher.courses=[course_geometry,course_algebra]
    3. #删除指定引用
    4. teacher.courses.delete(course_geometry)
    5. #清除所有引用
    6. teacher.courses.clear
    7. #判断是否存在引用
    8. teacher.courses.empty?
    9. #查看引用数量
    10. teacher.courses.size

Ruby on Rails,一对多关联(One-to-Many)的更多相关文章

  1. Ruby on Rails 實戰聖經阅读(三)

    由于是1.8.x:圣经的1.9.3差太多,所以另外按1.8.X来创建hello world 第一個Hello World!! 1. 创建项目rails -d mysql first 2.创建控制器  ...

  2. Ruby on Rails (ROR)类书籍

    Ruby on Rails (ROR)类书籍下载地址及其他(整理) Ruby on Rails 如此之热,忍不住也去看了看热闹,现在把一些相关的电子图书下载地址整理下,方便有兴趣的朋友. 2006-0 ...

  3. 《Ruby on Rails教程》学习笔记

    本文是我在阅读 Ruby on Rails 教程的简体中文版时所做的摘录,以及学习时寻找的补充知识.补充知识主要来自于 Ruby on Rails 實戰聖經. Asset Pipeline 在最新版 ...

  4. Linux超快速安装Ruby on Rails

    Linux超快速安装Ruby on Rails 时间 2014-11-25 11:45:11 Flincllck Talk 原文  http://www.flincllck.com/quick-ins ...

  5. 关于mybatis一对多关联时

    一对多关联时注:collection标签,property属性名称,column参数字段, ofType查询返回类型,select查询方法,javaType方法的返回类型

  6. (Hibernate进阶)Hibernate映射——一对多关联映射(七)

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  7. EF – 7.一对多关联

    5.6.8 <一对多关联(上)> 5.6.9 <一对多关联(下)> 一对多的关联,可以说是整个数据库应用程序中最常见的一种关联类型了,因此,必须高度重视这种关联类型CRUD的实 ...

  8. 管理不同版本ruby和rails的利器——rvm

    近年来,ruby on rails逐渐火了起来,我想各位码农早就耳闻,特别是那些做B/S项目的童鞋,早就想跃跃一试了. 笔者也是初次接触ruby on rails ,我想,对于初学者来说,最好的学习方 ...

  9. ruby on rails on windows

    这次想系统学会rails,最终目标是将redmine改造成顺手的工具,主要的手段就是开发redmine插件.虽然网上都推荐使用类Unix系统,可手头只有win7系统,就安装了. 难免会遇到这样那样的问 ...

随机推荐

  1. Codeforces1036G Sources and Sinks 【构造】【状态压缩】

    题目分析: 考虑一个源点集合$S$,如果$S$能到的点$T$比$S$小,那么$T$全连到$S$里面,其它点就到不了$T$啦.否则我们全连完后$S$集合被迫扩大,所以总能扩大满. 代码: #includ ...

  2. Tmutarakan Exams URAL - 1091(莫比乌斯函数 || 容斥)

    题意: 求1 - s 中 找出k个数 使它们的gcd  > 1 求这样的k个数的对数 解析: 从每个素数的倍数中取k个数  求方案数 然后素数组合,容斥一下重的 奇加偶减 莫比乌斯函数的直接套模 ...

  3. Verilog定义计算位宽的函数clogb2

    在很多情况下要计算输入输出的位宽,比如你写一个8*8的ram,那么地址需要三位去表示,那么这个函数的方便就体现出来了,你需要使用函数定义就好了,如果对于多文件可以包含定义的文件: 如果你的DEPTH是 ...

  4. PHP require php > 5.3.0

    项目版本要求 在5.3版本以上,如果是用 phpStudy 环境,那么直接切换版本即可

  5. IT项目管理——《人月神话》读后感

    这也许是和候红老师的最后的几节课了吧,侯老师是一个很有思想深度,很关心同学的好老师. 一开学就布置了阅读<人月神话>的作业,说实话,我没有看,以我的速度可能2.3个小时就看完了,但是我觉得 ...

  6. Ubuntu18.04 下的Gif录制工具

    正文: 开源地址:https://github.com/phw/peek Linux包相关的知识如果不知道可以看以前讲的:https://www.cnblogs.com/dunitian/p/9095 ...

  7. 最全面的 Spring 学习笔记

    http://www.codeceo.com/article/learn-spring.html 来源:泊浮目 分享到:更多36 Spring致力于提供一种方法管理你的业务对象.在大量Java EE的 ...

  8. cookie 常用操作

    Cookie:指网站为了辨别用户身份.进行会话跟踪而储存在用户本地的 key/value 型数据(通常经过加密), cookie key/value 型数据可以由服务器端自己定义. Cookie是由服 ...

  9. 在Derby中取得刚刚插入的“递增”类型的字段值

    现在才发现采用不同的数据库,对写程序影响很大. 以前常用SQL Server2000或Access,可能是因为都是Microsoft公司的产品,所以在从不同的平台转换的时候问题不是很大. 现在采用De ...

  10. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...