Ruby on Rails,一对多关联(One

Stella981
• 阅读 540

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

Ruby on Rails,一对多关联(One

                                                            Ruby on Rails,一对多关联(One

                       Ruby on Rails,一对多关联(One

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

  • 关联关系也是通过外键建立的。

  • 子对象都会拥有一个父对象的引用,使用belongs_to表示与父对象的关系。

不同之处是

  • 一个父对象对应多个子对象而不是只对应一个。所以需要在父对象中改用has_many引用子对象。

  • 由于has_may个子对象,所以在书写类定义的时候要用复数,这也是符合语言习惯的。

  • 获取子对象的方法不再返回单个子对象,而是返回子对象的列表。方法名字也是复数。

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

[ruby]  view plain copy

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

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

[ruby]  view plain copy

  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的引用。

[ruby]  view plain copy

  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

创建两个课程对象。

[ruby]  view plain copy

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

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

[ruby]  view plain copy

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

  

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

[ruby]  view plain copy

  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">]

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

[ruby]  view plain copy

  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
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Django之ORM(多对多)
一、ManyToManyField1、classRelatedManager"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况:1.外键关系的反向查询2.多对多关联关系简单来说就是当 点后面的对象 可能存在多个的时
Stella981 Stella981
2年前
Hibernate利用关联关系操纵对象
Hibernate利用关联关系操纵对象数据对象之间关联关系有一对一、一对多及多对多关联关系。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。本节讲解如何在Hibernate中处理这些对象之间的关联关系。本节使用到4个类,它们分别是Student(学生)、Card(学生证)、Group(班级)和Cou
Wesley13 Wesley13
2年前
@OneToMany、@ManyToOne以及@ManyToMany讲解(五)
一、一对多(@OneToMany)1、单向一对多模型假设通过一个客户实体可以获得多个地址信息。对于一对多的实体关系而言,表结构有两种设计策略,分别是外键关联和表关联。(1)映射策略外键关联在数据库中表customer和表结构address定义,如下:createtablecustomer(
Stella981 Stella981
2年前
Django框架(七):模型(三) 关联、模型类的属性
1\.关联1.1模型类关系关系型数据库的关系包括三种类型:ForeignKey:一对多,将字段定义在多的一端中。ManyToManyField:多对多,将字段定义在任意一端中。OneToOneField:一对一,将字段定义在任意一端中。1.1.1一对多关系
Wesley13 Wesley13
2年前
3 OneToMany ManyToMany MappedBy Cascade
1双向1N关联对于1N关联,Hibernate推荐使用双向关联,而且不要让1的一方控制关联关系,而使用多的一方控制关联关系。a.一的一方 表示班级@Entity@Table(name"team_1")publicclassTeam{@Id@Gen
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
2年前
Django多对多模型自定义中间媒介(through)在运行期的表现
使用自定义中间媒介来实现多对多关系的时候,主要的目的是在中间媒介中保存关系的特有属性。举个例子,比如学生与课程之间的关系就属于多对多的,而且当学生与课程建立关系之后随之还会产生附属的属性,如:成绩。如下例:<!lang:pythonclassStudent(models.Model):name
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这