2016-07-07 23 views
1

我知道,保存模型的一般順序是最深的孩子,然後逐漸上升到父母。但我相對於其他的回調不知道,它發生的線沿線的東西:嵌套父/子模型的模型回調以什麼順序運行?

ChildA - before validation 
ChildB - before validation 
Parent - before validation 

ChildA - after validation 
ChildB - after validation 
Parent - after validation 

ChildA - before save 
ChildB - before save 
Parent - before save 

... 

或沿的線條:

ChildA - before validation 
ChildA - after validation 
ChildA - before save 
... 

ChildB - before validation 
ChildB - after validation 
ChildB - before save 
... 

Parent - before validation 
Parent - after validation 
Parent - before save 
... 

的原因,這是非常重要的是,我有回調調整屬性,模型上屬性的可調整性取決於其他模型的屬性。

一個例子是,我想向Parent自動設置其屬性statusComplete如果ChildAchild B's狀態attributes are both完全and the children are both valid`。

我試圖用puts聲明來測試這個語句,但很明顯,這會導致一些奇怪的行爲(請參閱此問題:Nested form validation statements repeating multiple times),恐怕它不具有代表性。

我肯定讀了Rails指南,但也許我瞎了,因爲我沒有看到這個隨時隨地的參考...

+0

你有沒有找到答案? – geoboy

回答

0

,而把這種狀態機邏輯的回調可能是誘人的,這使得代碼難以理解。請考慮採用一種專用的方法,以更直接的方式收集和變更數據。

這也與數據的一致性和測試幫助,如this blog post描述。

+0

謝謝!現在,未來需要考慮的事情就是需要一些快速和骯髒的東西 – james

0

有趣的問題。默認情況下,父級中定義的回調將首先運行。 prepend: true選項允許您調整該行爲。

見 「定貨回調」 一節中Rails API。同樣值得檢查「可繼承回調隊列」部分,因爲重新定義方法與使用宏不同。

P.S.所有上述有效期至少爲4.2.5.2

0

版本通過與我曾經遇到過父被驗證,然後再孩子,但沒有護欄的核心成員已經宣佈這個軌試驗。

這就是爲什麼你可以移動的邏輯父:

class Sale 
    has_many :details 
    before_validation :evaluate_details 
    # validations 

    def evaluate_details 
    self.details.each do |detail| 
     detail.generate_info 
     detail.items.each do |item| 
     item.dance 
     end 
    end 
    end 
end 

class Detail 
    belongs_to :sale 
    has_many :items 
    # validations 

    def generate_info 
    # Do things 
    end 
end 

class Item 
    belongs_to :detail 
    # validations 

    def dance 
    # Dancing 
    end 
end 

這樣可以防止多個執行和管理的執行順序。

PD:您也可避免before_validation回調並手動調用該方法。