說穿了,所謂的Active Record關係(以下簡稱ARR)是用來描述不同model間的關係,或者可以想
成database中不同table間的關係,ARR可用Domain Specific Language(DSL)來描述。
以下方這張簡單的架構圖來說 (ps. 圖片來源參考至【Ruby on Rails Up and Running】chapter 3,
如有侵權,請不嗇告知)
這是一張線上瀏覽圖片的系統之架構,其中每個藍色方塊代表一個model,可以清楚的看到不
同的model間存在一些關係,其中包括 Many to one, 以及Many to many。
所代表的意義類似:
1. 分類(category)和照片(photo)存在多對多關係, 一種分類中會有多張照片,一張照片亦可能
屬於多個分類
2. 投影片(slide)和照片(photo)存在多對一關係,多張投影片可能參照到同一張照片
--
清楚釐清不同model間的關係之後,我們就可以用DSL來描述這些關係。
我們將DSL寫在相關的model中,舉例來說,要描述photo和slide間的關係,
我們可能會把photo寫成下面的樣子:
另一方面,我們也會把slide寫成:
這是一張線上瀏覽圖片的系統之架構,其中每個藍色方塊代表一個model,可以清楚的看到不
同的model間存在一些關係,其中包括 Many to one, 以及Many to many。
所代表的意義類似:
1. 分類(category)和照片(photo)存在多對多關係, 一種分類中會有多張照片,一張照片亦可能
屬於多個分類
2. 投影片(slide)和照片(photo)存在多對一關係,多張投影片可能參照到同一張照片
--
清楚釐清不同model間的關係之後,我們就可以用DSL來描述這些關係。
我們將DSL寫在相關的model中,舉例來說,要描述photo和slide間的關係,
我們可能會把photo寫成下面的樣子:
class Photo < ActiveRecord::Base
has_many :slides
end
另一方面,我們也會把slide寫成:
class Slide < ActiveRecord::Base
belongs_to :photo
end
由上面兩段code,我們清楚的看到兩個重點:
1. photo has many slides
2. slide belongs to (a) photo
藉由這種和自然語言很相像的DSL,我們就可以為每種關係塑模。
除此之外,針對photo和category之間的多對多關係,
我們也可以更改photo的程式碼為:
class Photo < ActiveRecord::Base
has_and_belongs_to_many :categories
has_many :slides
end
並且在category model中寫下:
class Category < ActiveRecord::Base
has_and_belongs_to_many :photos
end
一樣的,我們可以很白話的看出當中的關係:
1. Photo has and belongs to many categories
2. Category (also) has and belongs to many photos
如此一來,我們便可對不同model間的關係塑模了。
沒有留言:
張貼留言