SaveAll()とafretSave()の関係
saveAll()使う場合は、afterSave()の設定に要注意、というお話です。
データ変更後に、各時点の「Archive」を自動保存する機能をつけたかったので、afterSave()に保存処理を組み込んだのですが、正しく動作しません。
データの一部が保存されない、と悩んでいたら、原因は「saveAll()」。
複数の関連モデルを一度に保存するため、saveAll()で実行していましたが、saveAllの仕組みは、
「レコードの構造を解析してsave()を複数発行する」*1
関連モデルのsave()が行なわれる前に親モデルのsaveAll()が行なわれるため、
関連モデルのデータ=一部データ が保存されない、という現象になっていたようです。
また、単一モデルに複数関連モデルがある場合、毎回afterSave()が発行されるのだと思います。
Archiveデータ保存処理は、アクションメソッドでsaveAll()成功後に追加して実装しました。
*1:概要。細部異なるかもしれません