Ruby on Rails,一對多關聯(One-to-Many)
阿新 • • 發佈:2018-03-28
用例 存在 BE details 一對一 擁有 class room 方法
在上一篇文章中,我們知道通過has_one和belongs_to方法定義一對一關聯關系。接下來是更常見的情況,一對多關聯。
比如老師與所教課程的關系,一個老師負責多個課程。換成對象之間的關系就是:一個老師has may課程,課程belongs to老師。
和一對一關聯的相似之處是
- 關聯關系也是通過外鍵建立的。
- 子對象都會擁有一個父對象的引用,使用belongs_to表示與父對象的關系。
不同之處是
- 一個父對象對應多個子對象而不是只對應一個。所以需要在父對象中改用has_many引用子對象。
- 由於has_may個子對象,所以在書寫類定義的時候要用復數,這也是符合語言習慣的。
- 獲取子對象的方法不再返回單個子對象,而是返回子對象的列表。方法名字也是復數。
用例子說話,創建一個課程(Course)模型定義
[ruby] view plain copy
- rails g model Course name:string teacher_id:integer
生成了遷移任務,其中teacher_id是指向teachers表的外鍵。
[ruby] view plain copy
- #創建課程表的遷移任務
- 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的引用。
[ruby] view plain copy
- #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
創建兩個課程對象。
[ruby] view plain copy
- > course_geometry = Course.create(:name=>‘Geometry‘)
- > course_algebra = Course.create(:name=>‘Algebra‘)
由於在類定義中建立了引用關聯,對象可以進行適用於這些關聯關系的方法調用。比如說取得引用的對象列表使用teacher.courses方法,註意方法名字是復數。
[ruby] view plain copy
- > teacher = Teacher.find(1)
- > teacher.courses
- => []
teacher還沒有與course進行關聯,可以先取得引用對象列表在通過<<向courses列表中添加
[ruby] view plain copy
- > 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">]
除此之外還有其他方法可用
[ruby] view plain copy
- #直接指定所有引用
- 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)