Update: 原作者有摘要在 Massive List of Rails Development Tips一文
推薦 peedcode.com 上的 Rails Code Review PDF,廢話不多蠻實用的,一路看下來馬上學到好幾招跟不錯的工具,簡單走訪一下:
Store Sessions in the Database
用 ActiveRecord 存 Sessions 在 AWDwR 第二版都已經變成入門範例了,不過這裡提供的 Rake code 不錯用,幫你清除資料庫中過期兩週的Sessions 。
Use Custom Configuration Files
別把 config 統統扔到 environment.rb,可以拆成獨立的 YAML 檔案。也因此可以不必將 production mode 才用到的設定檔(如API密碼等)丟進 repository, 搭配 Capistrano 在 deploy 的時候從複製過來就可以了,
Use Constants for Repeated Strings
Keep Time in UTC
一開始就用 UTC 當預設時區
Don’t Loop Around ActiveRecord
ActiveRecord 跑迴圈的時候小心產生一筆一筆 SQL queries 啊,請愛用 :include 一次就把(子)資料讀出來,而不是一筆筆去捅資料庫。甚至直接寫點 SQL conditions,目標是讓 SQL query 一次即可。若要用 :select 請搭配 :join。
Beware of Binary Fields
若欄位有 Binary data,用 find 時請務必愛用 :select 只讀出必要欄位。另外也建議使用 with_scope method 或 scope_out plugin。
Cache Your Reports
Store Country Lists
別用 Rails 內建的 country_select,自己寫 Model才有彈性。
Avoid Bloated Controllers
RESTful 對 controller 的建議: 別塞太多 action 在一個 controller 裡。
Keep Your Controllers and Views Skinny
實在是 Rails 的原罪: 因為 ActiveRecord 提供很多好用的 method,所以我們習慣把 code 塞到 controller 甚至 view 裡。正確的作法應該盡量重構至 Model 中 (例如有複雜參數的 find ),有可讀性、可測試(model unit testing)跟好的MVC。請看這篇經典文章 Skinny Controller, Fat Model。這裡作者又在推薦了一次 with_scope 。
Don’t Store Objects in the Session
別這樣做 session[:user]=user,你的memory很快用完,而且session資料跟db資料不一致,請用 session[:user_id] = user.id。真要存 object 請裝 Memcached 吧。
Avoid Heavy Response Processing
耗用時間的操作請用 queuing system,入門方法可用 rake 跟 crob 自動執行,進階有 BackgroundRB, Amazon’s SQS 等。可以試試 acts_as_state_machine 這個 plugin 來設計自己的排程系統。
Use ActiveRecord Mailing
寄送大量郵件,介紹 ar_mailer plugin
Monitor Your Servers
最基本的 exception_notification plugin 是 production mode 必裝,一旦發生例外會寄信告知你。作者還介紹了一堆工具。
Don’t Cut Costs on Hardware
Test-Drive
The Rest of the List
- 使用 database indexes
- Profile your code: ruby-prof gem
- 不一定要裝大的 ImageMagicK,有小巧的 mini-magick 或 image_science 就可以縮圖了。
- 使用 attr_protected 來保護重要欄位
- Automate deployment: 使用 Capistrano or Vlad