在上一篇文章中,我们知道通过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. Android Studio导入jar包

    使用开源框架是,可以直接复制源代码到自己的项目(本人在Android Studio中操作报R程序包不存在),也可以使用jar包,下面记录一下今天使用SmartImageView.jar的过程,不记录S ...

  2. bzoj 2429: [HAOI2006]聪明的猴子 (最小生成树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2429 思路:就是找最小生成树最大的一条边,最小生成树的性质,最后加入的那条边就是最大的 实现 ...

  3. 【Gym 100947I】What a Mess

    BUPT 2017 summer training (for 16) #1D 题意 找到n个数里面有多少对具有倍数关系.\(1 ≤ n ≤ 10^4,2 ≤ a_i ≤ 10^6\) 题解 枚举一个数 ...

  4. emwin 存在多个窗口时,如何获取当前所在窗口

    @2019-02-20 [小记] emwin存在多个窗口时,如何获取当前所在窗口 > emwin 之获取当前窗口的一种方法 [需求] 用于在代码中获知当前呈现的是哪个窗口 [方法] 进入新窗口将 ...

  5. Equivalent Sets HDU - 3836 (Tarjan)

    题目说给出一些子集,如果A是B的子集,B是A的子集,那么A和B就是相等的,然后给出n个集合m个关系,m个关系表示u是v的子集,问你最小再添加多少个关系可以让这n个集合都是相等的 如果这n个几个都是互相 ...

  6. 单片机的外围功能电路 LET′S TRY“嵌入式编程”: 2 of 6

    单片机的外围功能电路 LET′S TRY“嵌入式编程”: 2 of 6 本连载讲解作为嵌入式系统开发技术人员所必需具备的基础知识.这些基础知识是硬件和软件技术人员都应该掌握的共通技术知识. 上期在&l ...

  7. TCP的三次握手和四次挥手图解

     1. TCP建立连接的三次握手 (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确 ...

  8. 如何在以太坊上搭建一个Dapp?

    原创: 前哨小兵甲 区块链前哨 昨天 策划|Tina作者|Mahesh Murthy俗话说,实践出真知!对于开发人员来说,最好的学习办法就是亲自动手做一个小项目.所以,接下来我们将会以一个投票程序为例 ...

  9. electron入门笔记(三)- 引入bootstrap

    源码:https://github.com/sueRimn/electron-bootstrap 当引入jQuery和bootstrap文件时,会报错,原因是:electron 的 Renderer ...

  10. NOI 2002 贪吃的九头龙

    树形dp #include<bits/stdc++.h> #define N 305 using namespace std; struct LEB{ int to,nxt,w; }e[N ...