ここ数日間、複数のオブジェクトを一度にロールバックできる元に戻すシステムとして paper_trail を使用しようと試みてきました。私はRailscastから始めて、何かを機能させるために最善を尽くしてきました。私は近づいているように感じますが、私の実装がより良くなる可能性がある、またはおそらく私が知らない、または私のスキルを超えている別の方法があると感じています.
これまでのところ、私はこれを試しました:
バージョンにparent_id列を追加しました。これは別のバージョン ID を保持します。
この ID を設定するメソッドを作成しました。保存、更新、または削除を行った後、親モデルと子モデルを渡し、その子の最新バージョンの parent_id を親の最新バージョン ID で更新します。次のようになります。
def set_parent_to_version(parent, child)
child.versions.last.update_attributes(:parent_id => parent.versions.last.id)
end
そして、親モデル以外にも影響を与える更新を行うときは、これを呼び出して、作成したばかりの子モデルのバージョンも更新します。
私の revert メソッドでは、params[:id] でバージョンを見つけ、parent_id params[:id] ですべての子を見つけて、それらすべてを具体化します。これはある程度うまく機能します。
問題はコールバックにあります-モデルにコールバックがあり、before_destroy で別のモデルを変更します。ただし、この場合、ユーザーがこの破棄を開始したのか、別のモデルを開始したのかがわからないため、parent_id を取得できません。つまり、Employee には多くのアイテムがあり、employee はアイテムを破棄し、item は employee before_destroy を変更します。before_destroy は、なぜ破壊されたのか、誰が破壊したのかを知りません。
papertrail の gem が、関連付けではうまく機能しないとすでに言っていることは知っていますが、これは可能でなければならないと感じています-どういうわけかコールバックを見ているのでしょうか? 私はこれについて深入りしすぎているかもしれませんが、取り消しが機能するアクションについては、非常に優れており、削除したくありません。
どんなアイデアでも大歓迎です。ありがとう!