2008年5月2日 星期五

some archives, 許多高手好文

http://ihower.idv.tw/blog/archives/1680
http://ihower.idv.tw/blog/archives/1691
http://ihower.idv.tw/blog/archives/1696
http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model


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


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





Date Formatting

用 parse_date 把 String 變成 Date 是個非常昂貴的操作,建議你直接用字串操作(正規表示法)把 String(例如從DB撈出來的db_date) 變成你想要的格式,或是從中拆出你想要的年月日。(PDF 有 example code)


ObjectSpace.each_object

DO NOT USE IT,你不會想在 per-request 下去執行的,很貴。


Symbol.to_proc

ActiveSupport 提供的 @var.map(&:name) 語法,雖然方便,但是用 inline block 的方法 @var.map{ |a| a.name| } 執行效率比較快。


Using .nil?

如果要測試的值已知不是 Boolean,那就不需要用 .nil 多一個 method call,直接 if x 就好了而不是 if x.nil?


nil? or empty? versus blank?

ActionPack 有提供 x.blank?,不需要用 x.nil? || x.empty?


Test Most Frequent Case First

用 case 時把較常發生的放前面,若都差不多,把貴的操作的放後面。


Optimize Access to Global Constants

在 Constant 前面加上 namespace operator :: 會比較快,減少查詢時間


Caching Data in Instance Variables

例如在 controller 裡面 def captial_letters { (”A”..”Z”).to_a } end 請改用 def captial_letters { @captial_letters ||= (”A”..”Z”).to_a } end


Local Variables Are Cheap

method 中傳進來的參數若常用,可以先存成 Local Variables 再來多次使用。


Interpolated Strnges

方法一 s = “:#{a}.#{b}” 比方法二 s = “:” <<>


In-Place Updates

直接修改比複製一份快: gsub! 比 gsub 快,merge! 比 merge 快。例如這個範例 s.gsub().gsub!().gsub! 而不是 s.gsub.gsub.gsub

沒有留言: