2017-10-18 20 views
0

ここに問題があります: ハード削除は、親を破壊して子どもが破壊されるはずです。 dependent: :destroyを使用すると問題なく動作し、親が破壊されると子は破壊されます。カスケード削除(ソフトとハード削除)ruby

約混雑についてはソフト削除します。もし私がソフトを削除したいと思っていたら、ユーザのフィールドを更新したかったのです。deleted_at: Time.now。それはソフト削除と呼ばれていますが、私はdelete_atフィールドを更新すると、ユーザのすべての関連付け/依存関係を破棄/無効にしたい。

どのような宝石を使用しなくてもどうやって可能ですか?

+1

宝石を使用すると何が問題になりますか?これは軽微な問題ではありませんが、[パラノイア](https://github.com/rubysherpas/paranoia)ライブラリは広く使用されている包括的なソリューションです。 –

+1

私は自分のキャリア上でこの車輪を再発明しようとする多くの欠陥のある試みを見た。私の助言は、単に図書館を使うことです! –

答えて

0

gemを使用することをお勧めします。これは、すべてのトリッキーなケースを処理しますが、それはあなた自身の解決策ではカバーできません。

しかし、あなたのプロジェクトに追加のライブラリを持たない場合、ActiveRecordコールバックを使って同様のものを実装できます。 コールバックはしばしば悪い習慣として扱われますが、このような状況では便利です。

destroyメソッドが呼び出される前に、before_destroyコールバックhttp://api.rubyonrails.org/v5.1/classes/ActiveRecord/Callbacks.html をトリガすることができます。 コールバックの本文内で、関連するすべてのデータを削除できます。

また、モデル定義でdestroyメソッドをオーバーライドして、レコードを実際の削除ではなく削除済みとしてマークすることを忘れないでください。