Ruby on Rails,一对多关联(One-to-Many)
在上一篇文章中,我们知道通过has_one和belongs_to方法定义一对一关联关系。接下来是更常见的情况,一对多关联。
比如老师与所教课程的关系,一个老师负责多个课程。换成对象之间的关系就是:一个老师has may课程,课程belongs to老师。
和一对一关联的相似之处是
- 关联关系也是通过外键建立的。
- 子对象都会拥有一个父对象的引用,使用belongs_to表示与父对象的关系。
不同之处是
- 一个父对象对应多个子对象而不是只对应一个。所以需要在父对象中改用has_many引用子对象。
- 由于has_may个子对象,所以在书写类定义的时候要用复数,这也是符合语言习惯的。
- 获取子对象的方法不再返回单个子对象,而是返回子对象的列表。方法名字也是复数。
用例子说话,创建一个课程(Course)模型定义
- rails g model Course name:string teacher_id:integer
生成了迁移任务,其中teacher_id是指向teachers表的外键。
- #创建课程表的迁移任务
- class CreateCourses < ActiveRecord::Migration
- def change
- create_table :courses do |t|
- t.string :name
- t.integer :teacher_id
- t.timestamps
- end
- end
- end
修改Teacherl类,增加一个has_many :courses的声明。和一对一关联类似在Course类定义中增加belongs_to :teacher的声明,建立指向Tacher的引用。
- #Teacher类定义
- class Teacher < ActiveRecord::Base
- belongs_to :class_room
- has_many :courses
- attr_accessible :class_room_id, :name
- end
- #Course类定义
- class Course < ActiveRecord::Base
- belongs_to :teacher
- attr_accessible :name, :teacher_id
- end
创建两个课程对象。
- > course_geometry = Course.create(:name=>'Geometry')
- > course_algebra = Course.create(:name=>'Algebra')
由于在类定义中建立了引用关联,对象可以进行适用于这些关联关系的方法调用。比如说取得引用的对象列表使用teacher.courses方法,注意方法名字是复数。
- > teacher = Teacher.find(1)
- > teacher.courses
- => []
teacher还没有与course进行关联,可以先取得引用对象列表在通过<<向courses列表中添加
- > teacher.courses<<course_geometry
- => [#<Course id: 1, name: "Geometry", teacher_id: 1, created_at: "2012-12-09 05:15:33", updated_at: "2012-12-09 05:22:04">]
除此之外还有其他方法可用
- #直接指定所有引用
- teacher.courses=[course_geometry,course_algebra]
- #删除指定引用
- teacher.courses.delete(course_geometry)
- #清除所有引用
- teacher.courses.clear
- #判断是否存在引用
- teacher.courses.empty?
- #查看引用数量
- teacher.courses.size
Ruby on Rails,一对多关联(One-to-Many)的更多相关文章
- Ruby on Rails 實戰聖經阅读(三)
由于是1.8.x:圣经的1.9.3差太多,所以另外按1.8.X来创建hello world 第一個Hello World!! 1. 创建项目rails -d mysql first 2.创建控制器 ...
- Ruby on Rails (ROR)类书籍
Ruby on Rails (ROR)类书籍下载地址及其他(整理) Ruby on Rails 如此之热,忍不住也去看了看热闹,现在把一些相关的电子图书下载地址整理下,方便有兴趣的朋友. 2006-0 ...
- 《Ruby on Rails教程》学习笔记
本文是我在阅读 Ruby on Rails 教程的简体中文版时所做的摘录,以及学习时寻找的补充知识.补充知识主要来自于 Ruby on Rails 實戰聖經. Asset Pipeline 在最新版 ...
- Linux超快速安装Ruby on Rails
Linux超快速安装Ruby on Rails 时间 2014-11-25 11:45:11 Flincllck Talk 原文 http://www.flincllck.com/quick-ins ...
- 关于mybatis一对多关联时
一对多关联时注:collection标签,property属性名称,column参数字段, ofType查询返回类型,select查询方法,javaType方法的返回类型
- (Hibernate进阶)Hibernate映射——一对多关联映射(七)
一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...
- EF – 7.一对多关联
5.6.8 <一对多关联(上)> 5.6.9 <一对多关联(下)> 一对多的关联,可以说是整个数据库应用程序中最常见的一种关联类型了,因此,必须高度重视这种关联类型CRUD的实 ...
- 管理不同版本ruby和rails的利器——rvm
近年来,ruby on rails逐渐火了起来,我想各位码农早就耳闻,特别是那些做B/S项目的童鞋,早就想跃跃一试了. 笔者也是初次接触ruby on rails ,我想,对于初学者来说,最好的学习方 ...
- ruby on rails on windows
这次想系统学会rails,最终目标是将redmine改造成顺手的工具,主要的手段就是开发redmine插件.虽然网上都推荐使用类Unix系统,可手头只有win7系统,就安装了. 难免会遇到这样那样的问 ...
随机推荐
- 「洛谷P1516」 青蛙的约会
洛谷题号:P1516 出处:? 主要算法:数论 难度:4.4 思路分析: 典型的同余方程.由于是纬线,绕一圈是可以绕回来的,所以是可以取模的. 阅读题目,很容易得到同余方程$ x + tm ≡ y + ...
- HNOI2019总结
HNOI2019总结 Day 1 开场看三道题,T1是个计算几何,T2是个操作树加\(border\),T3题意有点复杂.想T1想了半个多小时,发现那个钝角不是很会处理,但是40分暴力应该还是可以写, ...
- Dockerfile基础
Dockerfile基础Dockerfile分四部分组成: 基础镜像.维护者信息.镜像操作指令.启动时命令ps: 我的本地镜像已经有centos,若没有请使用docker pull centos 入门 ...
- X-PACK详解
启用和禁用启用和禁用X-Pack功能默认情况下,所有X-Pack功能都被启用.您可以启用或禁用特定的X-Pack功能elasticsearch.yml,kibana.yml以及logstash.yml ...
- Pro Git
1.安装 Linux: $ yum install git $ apt-get install git windows: 打开 http://git-scm.com/download/win,下载会自 ...
- 【STM32】PWM DAC基本原理(实验:PWM实现DAC)
虽然STM32F103ZET6具有内部DAC,但是也仅仅只有两条DAC通道,并且STM32还有其他的很多型号是没有DAC的.通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加. 不过S ...
- UVALive - 4225(贪心)
题目链接:https://vjudge.net/contest/244167#problem/F 题目: Given any integer base b ≥ 2, it is well known ...
- sha256加密
sha256: 1.使用npm安装 :npm install js-sha256 2.然后在组件中methods定义方法,在调用 // sha256加密密码 setSha(){ let sha256 ...
- AOP实践--利用MVC5 Filter实现登录状态判断
AOP有的翻译"面向切面编程",有的是"面向方面编程".其实名字不重要,思想才是核心,mvc的Filter让我们很 方便达到这种面向方面编程,就是在现有代码的基 ...
- Django 模板 继承和包含
##### 母版 ##### 这里是头部 {% block body-content %}{% endblock %} 这里是底部 #### 继承模板 ### {% extends 'layout.h ...