SaveAll()とafretSave()の関係

saveAll()使う場合は、afterSave()の設定に要注意、というお話です。


データ変更後に、各時点の「Archive」を自動保存する機能をつけたかったので、afterSave()に保存処理を組み込んだのですが、正しく動作しません。

データの一部が保存されない、と悩んでいたら、原因は「saveAll()」。
複数の関連モデルを一度に保存するため、saveAll()で実行していましたが、saveAllの仕組みは、
「レコードの構造を解析してsave()を複数発行する」*1


関連モデルのsave()が行なわれる前に親モデルのsaveAll()が行なわれるため、
関連モデルのデータ=一部データ が保存されない、という現象になっていたようです。

また、単一モデルに複数関連モデルがある場合、毎回afterSave()が発行されるのだと思います。


Archiveデータ保存処理は、アクションメソッドでsaveAll()成功後に追加して実装しました。

*1:概要。細部異なるかもしれません