2013年1月20日 星期日

Active Record關係

在【Ruby on Rails Up and Running】一書中,有一整個章節在討論Active Record關係。

說穿了,所謂的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寫成下面的樣子:

 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間的關係塑模了。

沒有留言:

張貼留言