1. 程式人生 > >Ruby on Rails,一對多關聯(One-to-Many)

Ruby on Rails,一對多關聯(One-to-Many)

用例 存在 BE details 一對一 擁有 class room 方法

在上一篇文章中,我們知道通過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. 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

Ruby on Rails,一對多關聯(One-to-Many)