最近在看一些NoSQL的東西,於是想以MongoDB進行一些實作的練習。這篇文章是我在練習過程中,環境設定的筆記。
Installing Rails 3
請看我的上一篇文章
Installing MongoDB
我的開發環境是Ubuntu和Windows(在家用Ubuntu、出外用Windows,所以試了兩個環境)。Linux的話,個人建議不要用package system(apt/yum)的MongoDB。首先,絕對不要apt-get install mongodb。我一開始練習MongoDB時,是用apt-get裝的,會抓到一個舊到爆炸(1.4.4)的stable版本,這個版本mongo console client打錯指令還會crash(這是stable版嗎?)。
如果一定要用package的話可以考慮apt-get install mongodb-unstable或apt-get install mongodb-snapshot。但我是直接去官網抓build好的版本,再sudo copy到/usr/bin就好了。
MongoDB Object Mapper: Mongoid
Mongo的Ruby Object Mapper有很多種,可以參考官網上的列表。我選用Mongoid的原因有二:
- Mongoid的官網做的還滿有模有樣的,看樣子應該有認真維護 XD
- Devise認證機制內建支援Mongoid
安裝照著官方installation文件做就好了:
gem i mongoid –pre
gem i bson_ext
如果是Windows系統的話,mongo gem需要build一些native code,所以推薦裝RubyDevKit,裝完就可以順利的安裝mongo相關gems。
Mongoid使用上非常的簡單,Mongoid蓋掉了ActiveRecord的generators。要快速建出一個能動的環境,在設定好gems後只需要:
rails g mongoid:config
rails g scaffold article title:string content:string
只要mongod開著,這樣就可以動了,不用做data migration。唯一會踩到的雷可能是用了舊版的mongodb,所以就如前面提到的,請不要apt-get install。
Authentication: Devise
Devise是一套不錯的rails認證機制,而且內建對Mongoid的支援 一樣照著官方文件做就能動,整合非常簡單。安裝:
gem i devise
整合進app:
rails generate devise:install
rails generate devise User
接下來只要在view裡把link接一接就好。如果原本就用過devise,基本上用ActiveRecord或Mongoid沒啥差別。要速查link path helpers的話可以用rake routes。
唯一要注意的地方是要記得自己打index,我原本以為Model中的
devise :database_authenticatable, :registerable #……
這行,會自動在Mongoid Model上加上index。但rake db:mobgoid:create_indexes後,User collection上還是沒有任何index,所以要自己在Model上加:
index :email, :unique => true
然後再執行一次rake db:mongoid:create_indexes,把index打上去。
另外,有人做了Rails3+Mongoid+Devise的整合包。但Devise和Mongoid的整合實在太簡單了,不彷自己做一遍,也比較容易了解細節。
Deployment Environment: Heroku & MongoHQ
Heroku是一個雲端的Rails Hosting Platform,其使用方式應該很多文章介紹過了,這裡就不多廢話。基本上注冊好heroku帳號後,在rails app路徑下:
heroku create appname
git push heroku master
就可以把app deploy上去。
MongoHQ是一個雲端的MongoDB Hosting服務,提供了免費(16MB Limit)及付費的MongoDB空間。由於Heroku與MongoHQ有合作,並將MongoHQ做成了Heroku的一個addon,所以整合特別簡單。這裡是官方文件,只要下一行指令:
heroku addons:add mongohq:free
heroku就會自動向MongoHQ註冊一個資料庫,並設定rails的環境變數。注意官方文件有個地方沒講的很清楚,在config/mongoid.yml中,多加上mongohq的設定:
production:
uri: <%= ENV['MONGOHQ_URL'] %>
設定好後,MongoID就可以吃到MongoHQ的環境變數,並正確地建立資料庫連線。
順便列一下Heroku合作的資料庫中,免費方案的比較:
- Heroku內建Database: 5MB (Postgre SQL)
- Redis To Go: 5MB (Redis)
- MongoHQ: 16MB (MongoDB)
- Cloudant: 100MB, 500k requrest per month (CouchDB)
開發筆記待續…