2016-09-02 32 views
0

如果已經有人問過類似的問題,我很抱歉找不到任何相同的東西。爲什麼before_save被認爲是不好的?

因此,有人可以告訴我爲什麼before_save特別有條件的可以被認爲是壞的嗎?

before_save :something, if: Proc.new { self.abc == 'hello' } 

所以我理解爲什麼有時驗證適合好多了,但是我不明白的是爲什麼有些人認爲,回調可以是用一件壞事,他們迫使你只寫驗證,但從來沒有讓他們有條件。

我個人認爲可能存在更大的問題,因爲此更改可能會影響已存在的條目,因此如果您計劃僅在某些情況下修改數據,則可以實施條件驗證程序或爲提供if。爲什麼有些人認爲這不好?有人可以幫助我嗎?

非常感謝!

回答

1

我認爲,before_savebefore_validation唯一的缺點是,當它是不理解或正確

  • ,它應該是使用後,才審慎考慮,這種回調的真正含義是利用全球明智使用對於所有記錄(也考慮已存儲在數據庫中的舊記錄)
  • 如果回調只適用於某些特定記錄 或條件,那麼最好不要污染模型,只實現邏輯外部該模型。
  • 如果回調正在改變一個狀態,可能是記錄或其他記錄,那麼這些回調的名稱應該明確地說出來,並且開發人員應該知道並理解這些回調不應該有無意的效果。
  • 如果回調沒有改變狀態,那麼它立即可以安全使用,因爲它保證了不變性和冪等性。
  • 回調的順序很重要,而對發生的事情的有限理解可能會讓開發人員/新開發人員無意中編寫代碼,並且可能無法一直工作。
  • before_savebefore_validation是不同的,一個應該開發者瞭解,一些回調是爲了作爲before_save,有的爲before_validation
從這些

除此之外,我沒有看到before_save任何問題因爲它可能會清理並破壞代碼的邏輯,並且允許重用,特別是如果您有模型的子類。

只是我對此事的直接想法...

0

使用回調都是標準的Rails的做法!在適當使用時,它們在維護數據完整性方面非常幹練。回調函數大量用於數據格式化用戶輸入(如從手機號碼字段中刪除空格或破折號),通過驗證迴應錯誤只會讓用戶感到沮喪。使用驗證來處理您無法預測的案例或其他方式無法預測的數據以及其他地方的回調(例如在保存前降低電子郵件的數量)。

相關問題