RailsのO/RマッパーことActiveRecordの削除(delete)は、通常、物理削除の仕様となっています。
これってビジネス利用では結構辛い仕様ですよね?
もちろん、そんな人向けに論理削除に切り替えられるようなgemがいくつも存在しています。
その中で、個人的なお勧めはkakurenbo
というgemです。
ちなみに他の似たようなgemとの比較は、このgemの作者自身がやっているのがお勧めです。
インストール
Gemfile
gem 'kakurenbo'
後はいつも通りbundle update
でインストールされます。
設定方法
論理削除対象としたいテーブルにdeleted_at
カラムを追加するだけです。
Modelsはモデル名に書き換えてください。
$ rails generate migration AddDeletedAtToModels deleted_at:datetime
$ rake db:migrate
こうしておくと、モデル側で何も宣言することなく、勝手に論理削除の適用テーブルとなります。
お察しの通り、注意事項があります。
- これ以外の用途で
deleted_at
というカラム名が使えなくなります。 -
deleted_at
カラムにIndexを貼る事をお勧めします・・・ - 全テーブルで自動的に実施されるわけではないので、テーブルごとに手動でmigrationファイルを作ってあげる必要があります。
使い方
後は普通にRailsのソースコードを書くだけです。
Model.find # 論理削除されていないデータのみが検索される
model.destroy # 物理削除ではなく、論理削除される
model.destroyed? # 論理削除されているかどうかをチェックする
また、このgemをインストールする事によって、以下のメソッドが使えるようになります。
Model.with_deleted # 論理削除済みデータも含めて検索する
Model.only_deleted # 論理削除されたデータのみを検索する
Model.without_deleted # 論理削除されてないデータを検索する(findと同じ)
model.destroy(hard: true) # 物理削除する
model.restore! # 論理削除されたデータを復旧する
お手軽ですね。