2009年10月19日 星期一

使用Scaffold在Ruby on Rails敏捷開發

首先,我想先說一下結論好了

在這次玩了scaffolding還有console才體會到什麼是敏捷開發

不過敏捷開發不代表新手也能像宣傳一樣,15分鐘架好部落格

要去理解後面整個概觀花上幾天都不是什麼稀奇的事

但是一旦了解了,你還是會不禁讚嘆這實在是太棒了

-- -- -- -- -- --

這次主要是因為資料庫程設作業一就出個一很夭壽的題目

所以才會決定要來玩玩rails

一方面是因為題目要求的東西根本就是網頁程式(包含動作和內容)

另一方面是就算使用VB(or c++, java)開發,同樣需要一些時間去摸

不同趁此機會再把玩一下rails ^_^

至於ASP...一開始IIS伺服器就不給我動作,所以就放棄了

這次用的配備一樣,instantRails+AptanaStudio

(AptanaStudio有更新了,剛開始用一整個不適應,找不到一些常用指令產生器的頁面

不過後來發現用到機會不大...另外有新增一些視窗,用起來更方便)

使用scaffold的方法很簡單,但是也很重要:

依照慣例設計資料表

怎麼設計資料庫就不是這邊的重點就不談了

主要是釐清資料表與資料表之間的關係(關聯)

如果一張資料表a1有用到foreign key:fk參考到table a2的屬性id

那麼這個foreign key的資料表屬性名稱就應該命名為a2_id

另外,如果是多對多的表格b1, b2(像是書和作者的關係,一本書可能會有多個作者,

而一個作者可能寫過多本書這樣的關係就是多對多)

就必須再拉出一個表格 b1_b2包含屬性b1與b2的key,用來存放b1,b2的關係

當然,table b1_b2中的屬性都是foreign key,所以命名一樣要遵照上面的慣例

假設分別對是對應到b1與b2的id,屬性欄位就應該是b1_id, b2_id

這邊要注意的是這張多出來的表格命名不是隨便把兩張資料表中間用個底線連起來

而是依照名字的排列順序來命名,把較小的放在前面

如果真的不知道誰大誰小...就開啟irb把兩個名稱去做比大小吧XD

決定好整個資料庫架構的時候,就可以開始scaffold啦

指令為:
ruby script/generate scaffold TableName attribute:dataType ....

#請參考: 第一個資料庫應用(with scaffold)--Ruby on Rails 完全新手手冊

(有一點要修正,scaffold的目標應為單數型態,出來的資料庫會自動成複數形態)

等scaffold完所有的table之後,就可以下rake db:nirgrate

作migrate的動作,一次建立所有資料表,然後就可以直接用啦

接下來就可以直接利用scaffold的出來的網頁與程式,修改成需要的樣子

節省掉很多類似的程式碼key in,可以專注在其他程式與頁面的設計,測試也方便

當然做scaffold*還是有缺點,一但資料庫調整,scaffold出來的網頁就掛了

所以在設計時就要很小心(*本文的scaffold是靜態的,動態scaffold已在rails 2.0捨棄)

談完scaffold之後來說說active record的關係

常見的關聯式資料庫關係:一對多,多對一,一對一,多對多;分別可以對應


has_many, belongs_to, has_one, has_and_belongs_to_many

向上面的例子在a1就是belongs_to a2, a2 has_many a1,

b1 has_and_belongs_to_many b2, b2 has_and_belongs_to_many b1

要對資料表設定關係,就是在該model中加入一行簡單的指令即可

以a1為例
class a1 < ActiveRecord::Base
belongs_to :a2
end
就是這麼簡單~ 但是這邊要一樣注意一下單複數形態,has_one, belongs_to接的是單數

而其他兩個關係接的當然就是複數形啦

好處?

假設你都依慣例設定好書籍與作者的關係,那麼要從書籍取得作者的名稱就異常簡單..

書籍.作者 , 沒錯,就是這麼簡單,反之要取得某個作者寫過的書

作者.書籍 , 嗯~結束

最後是console

這個是不起眼,卻是了不起的工具

可以把它看成是for rails的irb

只要打上ruby script/console就可以使用

簡單說的應用,就像很多mysql初學者不知道該怎麼下sql一樣

這時候就可以使用 MySQLQueryBrowser,直接對資料庫下Sql指令一樣

設定好的關係,可以利用console去驗證是不是自己要的結果

當然,就像irb一樣,也可以下一些ruby指令,不過已經和整個資料庫連線

可以去對資料庫作測試、查詢、修改等動作,一整個就是超方便

雖然篇幅只有佔一點點,不過卻是不得不說的好功能