2013-05-26 57 views
0

我有一個after_initialize回調,我希望發生在模型創建或實例化時直接,而不是通過其他地方的關聯加載。事情是這樣的:如何通過Rails中的關聯區分直接實例化和實例化?

after_initialize :check_status, if: "instantiated_directly?" 

這樣MyModel.find(1)將觸發檢查,但other_model.my_model不會。

狀態是一個長進程的狀態變量,只需要在一些長時間運行的進程開始之前進行驗證。如果進程似乎正在進行,我想阻止用戶加載模型。我希望仍然能夠在其他地方出於各種其他原因訪問該模型中的屬性。

回答

0

防止讀取可能不是用於改善此問題的最佳媒介,也不是試圖超越其自身範圍以確定如何加載明智想法的模型。我反而建議你只需添加一個驗證,以確保記錄可以在不與你的後臺進程,一拉干擾被修改......

validate :safe_to_edit? 

def safe_to_edit? 
    some_state_variable 
end 

你的模型也暴露這裏safe_to_edit?方法,讓你的控制器或其他對象,以確定獨立於檢查驗證的最佳行爲,例如,如果客戶端服務輪詢在可以安全編輯時標記用戶,或者您希望延遲響應並在幾秒鐘內在後臺作業中再次嘗試等等。

+0

驗證只會在保存時起作用。我擔心模型的後續負載。該過程異步更新模型中的各個字段。如果這個過程以某種方式中斷,我不希望第二天再次開始計劃的過程。 – jordanpg

+0

無論如何,我對原始問題的答案感到好奇,與這種情況的具體情況無關。 – jordanpg

+0

你可以擴展ActiveRecord來做你想做的事情,但我保證你會在屁股上咬你。只要做對了,這很容易,而不是堅持顛覆你使用的工具。 – coreyward