カスケード削除 (ソフトおよびハード削除) 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 メソッドをオーバーライドして、レコードを実際の削除ではなく削除としてマークすることを忘れないでください。