71
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-03

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

お手軽ですね。

71
69
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
69

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?