Techioz Blog

カスケード削除 (ソフトおよびハード削除) Ruby

概要

そこで問題は次のとおりです。 完全削除では、親を破棄したため、子も破棄される必要があることは明らかです。そして、 dependency: :destroy を使用すると、正常に動作し、親が破棄されると、子も破棄されます。

論理的な削除についての混乱について。ユーザーを論理的に削除したい場合、そのためにユーザーdeleted_at:Time.nowのフィールドを更新したいと思います。それは論理的な削除と呼ばれますが、deleted_atフィールドを更新するときに、ユーザーのすべての関連付け/依存関係を破棄/無効にしたいと考えています。

gemを使わずにどうやってそれが可能ですか?

解決策

独自のソリューションではカバーできない、あらゆる難しいケースに対応できる gem を使用することをお勧めします。

ただし、プロジェクトに追加のライブラリを含めたくない場合は、ActiveRecord コールバックを使用して同様のものを実装できます。 コールバックは悪い習慣として扱われることがよくありますが、この状況では役立つ場合があります。

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

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