【Rails】paranoiaで論理削除を実装する

RailsのActiveRecordの削除(delete)は、通常、物理削除になっており、実際にデータがデータベースから削除されます。それに対して、論理削除は実際にはデータを削除せずに、削除されたと見なすフラッグと呼ばれるカラムを設定して、ユーザーには削除しているかのように振る舞い、必要時には元の状態に戻せるものです。「ユーザーが退会した後も、システム上一定期間はユーザーのデータを保持しなければならない。」や「違反等があり、一時的にアカウントを凍結したい」などの場合に、論理削除が使えると思います。
Railsではparanoiaというgemライブラリを利用することで簡単に実装することができます。このgemはacts_as_paranoidというgemを再実装したものです。

GitHub
https://github.com/rubysherpas/paranoia

実行環境はこちらです

Gemのインストール

Gemfile

$ bundle install します。

カラムの追加

論理削除したいモデルに deleted_atとindexカラムを追加します。

マイグレーションファイルは以下の通りです。

$ rails db:migrate を実行します。

モデル

対象モデルに acts_as_paranoid を追記します。

これでparanoiaの導入は完了です。

コンソールで試してみる

通常通りに destroy を実行すると、deleted_atにタイムスタンプが入り、物理削除ではなく論理削除になります。

再度、findしても論理削除されたデータは取得できません。

物理削除をしたい場合は really_destroy! を実行します。

削除したデータの確認

論理削除したデータのみ取得する場合です。

論理削除したデータとしていないデータを合わせて取得する場合です。

論理削除したデータを除いたデータ場合です。

論理削除から元に戻す

restoreを実行します。

論理削除カラム名の変更

デフォルトではdeleted_atが論理削除のカラム名として使われますが、別名にしたい場合はcolumnオプションで指定します。

デフォルトスコープをスキップしたい

論理削除は使いたいがデフォルトスコープはスキップしたいという場合です。

Callbacks

コールバックは以下のように、メソッドを呼ぶことができます。

以上です!
そのほか、追いきれていないところもありますので、ドキュメントも参考にしていただけたらと思います!


投稿者:

Shuji Tenra

「仕事に特化したQ&AサイトJobQuery【ジョブクエリ】」の開発/運営をしています。https://jobquery.jp