Help us understand the problem. What is going on with this article?

Rails4で論理削除を手軽に実現する。

More than 5 years have passed since last update.

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!            # 論理削除されたデータを復旧する

お手軽ですね。

tamano
勉強会のメモや、試行錯誤した履歴を実験ノート的に書きます。 というつもりだったんですが、実際は会社で若手の子に教える内容のメモになっていたり。
https://github.com/tamano/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away