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指令,不過已經和整個資料庫連線

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

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

2009年8月25日 星期二

使用VB讀取Unicode字元


嗚~好久都沒寫了,這次先來點清淡一點的布丁吧XD

這次處理客語統計的資料的時候,發現到不像國文的統計一樣,系統對該文全部的unicode有辦法以System.Char來讀取,而是客語使用System.Char來讀取則會發生嚴重的錯誤。原因是有許多無法顯示的字,而這些字並非對應到標準的字元區間(就是落在字定字元內),而在這一區段的字元System.Char會以標準字元去做讀取,也就是那些看不見的字,會被拆成許多個小區段來作處理。所以最終導致我在整理資料時會出錯。

這次解決方法所使用的類別為StringInfo以及TextElementEnumerator,都是在System.Globalization下的類別,使用方法很簡單

Dim tee As TextElementEnumerator = StringInfo.GetTextElementEnumerator(data)
Dim s As String
While tee.MoveNext
 s = tee.Current
 ...
End While

上述data是要讀取的unicode字串,該字串的每個unicode字元則是s。因為TextElementEnumerator並不是實作IEnumerable,而是實作IEnumerator,所以不能用for each來存取,要用上述的方式來讀取字串中每一個unicode字元。不過是IEnumerator要實作成IEnumerable也不會太難,只不過有沒有那個必要就看個人吧~
下次要寫處理unicode的程式就這樣小心的用吧^^

2009年1月16日 星期五

使用InstantRails架設可以對外的網站

嗯...久違的文章,距離上次發文好像已經過了五個月。這次會PO文也是剛好需要用到這個東西,網路上又找不到相關資料(我記得我有看過,但是就是找不到),所以經過大概4~5個小時try error(好像也沒這麼久拉),終於把站給架好了...沒想到意外的簡單,想到就想捶心肝(汗)。

ma...就直接來進入重點好了,這次使用的原理是利用Apache proxy對應的方法,一般網路上都是使用proxy balance,先製造cluster然後再用Mongrel對應的設定的cluster,最後再把cluster掛到proxy上面。但是,偏偏InstantRails的模組裡面硬是沒有proxy balance。所以在大腦快要壞掉之前終於try出了一種方法,就是既然可以先對應到cluster再對應到proxy,那我就乾脆把mongrel直接對應到proxy上就好了阿~在這邊我是利用InstantRails裡面附的typo來做例子,首先打開老東西,httpd.conf。如果不知道的話....就這樣也可以。

然後直接拉到最下面,更改下面的值


 

 
<virtualhost :8080>
ServerName typo
ProxyPass / http://localhost:3002/
ProxyPassReverse / http://localhost:3002
</virtualhost>

這樣就已經把虛擬的主機架好,而對應的PORT是8080(是Tomcat預設的listening port,如果有裝Tomcat就再選一個其他的Port吧)。不過這樣測試還是會連不到...原因很簡單,你沒有去listen port 8080...所以雖然伺服器會自動把從port 8080過來的資料轉給mongrel,但是沒有listen的情況下,OS根本不會丟port 8080的資料給他(伺服器)...所以,不要急著關掉httpd.conf,開始在拉到最上面,然後慢慢往下拉,接下來就會看到這幾行
#Listen 3000
#Listen 12.34.56.78:80
#Listen 127.0.0.1:80
Listen 80

只要在Listen 80後面再加上一行,Listen 8080,好,大工結束。存檔就可以等者看結果了,可以在瀏覽器打上 http://你的IP:8080/ 應該可以看到辛苦作的網站了,可以用力的推出去分享給別人,不用再望著localhost孤芳自賞。