2010-10-09 51 views
9

比方說,我們有一個模型中的方法是模型方法本身應該調用「保存」嗎?

  1. 需要在保存記錄只叫
  2. 可以更新模型本身,因此該模型需要重新保存後記

如果「保存」呼叫發生在方法本身內部,如下面的代碼

def result 
    save! if new_record? 

    # do some funky stuff here that may also change the model state 
    # ... 
    # And calculate the return value 
    search_result = "foo" # Let's say "foo" is the value we calculated 

    save! if changed? 
    search_result # return 
end 

或者應該外部觀察者(th e控制器)負責根據需要調用保存?

+0

以某種方式相關的問題:http://stackoverflow.com/questions/3125198/should-a-modifying-class-method-save-itself-or-be-explicity-called-after-the-meth – 2010-10-09 16:36:52

+0

此演示文稿測試可能能夠幫助您找出該模型上的界面變得奇怪的地方。 https://github.com/jimweirich/presentation_testing_why_dont_we_do_it_like_this/raw/master/pdf/testing.key.pdf如果您覺得在測試應用程序時必須打到分貝,那麼可能有一些功能可以考慮到這將使架構更易於使用。從第pg開始。 69. – 2011-02-07 21:15:21

+0

不知道它是如何與問題實際相關的,但是出色的表現 - 感謝分享! – 2011-02-09 06:08:18

回答

4

如果你的方法真的需要這麼做,那就這樣吧。

不過,我會讓它從尋找你爲什麼這樣做(的意見可能是很好的在這裏)的方法清晰,並會肯定使這個bang_method!,使其清楚誰調用它,這方法很容易與對象混淆在一起。

此外,方法名稱result(我知道,這可能不是您真正的方法名稱)有點意味着您只是提取數據,並且稍微多一點。也許load_result!在這裏更合適,爲了讓它更清楚你不僅僅訪問一個屬性,而且實際上是在執行繁重的操作來獲取它。

2

程序何時在文件上保存數據?

a)僅當用戶需要時(直接或間接)? - 這是控制器案例

b)只有當程序達到其正確性和數據完整性的一部分時? - 這是模型案例

c)兩者。

我會爲(c)投票。我希望這種歧視能讓事情變得有點直接。另外,從面向對象設計的角度來看,save()方法屬於它的類的公共契約;它可以被任何人調用。鑑於此,一個類負責其公共契約,並且如果需要,對象可以隨意調用它自己的方法。

4

當然,有必要讓模型堅持下去。但值得考慮的是保存是否是您的應用程序的最佳方法。

在當前的例子中,我們有一個模型在長時間運行的方法中異步處理文件(我們使用sidekiq來關閉進程)。在方法內部,定期更新持久屬性,以便狀態信息可用於其他請求。

我們使用update_column而不是保存,因爲

  1. 我們不想要或需要的AR回調的開銷,我們特別想跳過驗證,以確保發生更新當然,馬上。
  2. 我們只需要更新一個屬性。使用update_column避免了需要確定任何其他屬性是否需要被保存(或不保存。)

模型內部,類似的方法

  • update_column
  • 保存( :validate => false)(授予,同樣的方法,但不同的選項)
  • 觸摸

等,通常可能堅持比一個普通節省的變化的更合適的方式。

相關問題