ADZ 學習筆記

Ruby/Rails, Startup, Life

Rails 筆記 - activerecord 實作 (二) - refactoring

| Comments

上一篇 提到 activerecord 提供 after_create callback 外,還有以下 hook 讓你在特定時候做您指定的事情:

  1. before_validation
  2. after_validation
  3. before_save
  4. before_create
  5. after_create
  6. after_save
  7. after_commit

起初做 晚鳥票 看到這些 callbacks 簡直是瘋了,因為真是太方便,想說可以把部分 transaction 的丟到 callback,搭配 validate 的 if:, unless:, on: 就可以讓 transaction 變得超乾淨的 ...

最後發現,這根本是錯誤使用,結果 hsr_tickets 這張 model 變得超肥、又錯綜複雜,每次都要看很久才知道什麼時候做了什麼事。

開始回頭思考這些 callbacks 的設計,我想應該只適用於 非常單純的情況,例如: 每次 update record 都 log update user id and timestamp 到另外一張 table 之類的事情。

後來把晚鳥票 refactring 後,得到一些想法:

  1. 如果 model 內 business logic 的 validation 太多、邏輯太錯綜,有可能是這張 model 一次做了太多事情,看要用 STI 拆開,或把用 xdite 大大建議的 reform 把 model 的 validation 拆到 form 層解決。
  2. transaction 如果跨太多 model 又太長,放在 controller 裡又很亂的話,開另外一個 class 賦予新的空間專門處理。

By the way

今天是寫 blog 的第二天,希望有毅力可以撐下去 ...

Comments

comments powered by Disqus