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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值