2016-07-07 16 views
1

私は、モデルが保存される一般的な順序は、最初に一番深い子であり、その後徐々に親になることを知っています。これが重要な理由は、私がコールバックを持っているということですネストされた親子モデルのモデルコールバックはどのような順序で実行されますか?

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 
... 

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 

... 

ORの線に沿って:しかし、私はの線に沿って何かが起こるん、他のコールバックに関して思ったんだけど属性を調整し、モデル上の属性の調整可能性は、他のモデルの属性に依存します。

一つの例は、私が自動設定されたstatus属性にParentCompleteand the children are both完全attributes are both状態ChildA場合とchild B's valid`になりたいということです。

putsステートメントを使ってテストしようとしましたが、これは奇妙な振る舞いをします(この質問:Nested form validation statements repeating multiple timesを参照)。それは代表ではないと思います。

コールバックでステートマシンロジックのこの種を置くことは魅力的かもしれませんが、...それを

+0

この回答はこれまでに見つかりましたか? – geoboy

答えて

0

を、私は間違いなくRailsのガイドを読んで、私はこのどこかへの参照を見ていないので、多分私は盲目ですコードを理解するのが難しくなります。代わりに、より簡単な方法でデータを収集し、変更するための専用のメソッドを持つことを検討してください。

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コールバックを回避し、メソッドを手動で呼び出すこともできます。

関連する問題