• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

RubyonRails,一对多关联(One-to-Many)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

                                                            

                       

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

  • 关联关系也是通过外键建立的。
  • 子对象都会拥有一个父对象的引用,使用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.   
  8.       t.timestamps  
  9.     end  
  10.   end  
  11. 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  

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
RVM安装&amp;下载Ruby发布时间:2022-07-14
下一篇:
Windows下安装ruby和sass运行环境发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap