【Rails】レコードの論理削除を簡単に導入する

こんにちは!CODE CLUB965のKです!

今回は、RailsでDBのレコードを論理削除するための実装方法について書いていきます。

論理削除とは?

初学者の方だと、そもそも論理削除って何?と思った方もいると思うので簡単に説明します。

まず、「論理削除」の対となる言葉として「物理削除」があります。
物理削除は、DBからレコードを完全に(物理的に)削除します。

それに対して、論理削除は対象のテーブルに削除フラグ(Boolean型)を用意することで、「trueなら削除された」、「falseなら削除していない」という感じでレコード自体は削除せずにユーザー側だけに削除されたように見せることができます。

論理削除の利点としては、レコード自体はあるのでいつでも復元が可能なことです。

もちろんデメリットもあります。
デメリットとして、レコードは残ったままなので、データ量がどんどん増大してしまいます。
それによって、予期せぬバグが起きたり検索機能が劣化したりする可能性もあります。

なので物理削除を選ぶか、論理削除を選ぶかはケースバイケースです。
状況に応じて使い分けましょう。

論理削除の導入方法

1. gemファイルに「paranoia」を追加

gem 'paranoia'

ファイルに追記したら、「bundle install」します。

2. 対象のテーブルにカラムを追加

論理削除を導入するテーブルに、「deleted_at」というカラムを追加します。
マイグレーションファイルに以下を追加すればいいです。

class ・・・
  def change
    create_table :テーブル名 do |t|
      t.datetime :deleted_at
      ・・・
  
      t.timestamps
    end
  end
end

既に作成されているテーブルであれば、

rails g migration AddDeletedAtToTableName deleted_at:datetime

とコマンドを叩けばカラム追加用のマイグレーションファイルが生成されるので、

class ・・・
  def change
    add_column :users, :deleted_at, :datetime
  end
end

と書けばカラムに論理削除用のカラムが追加されます。

3. モデル(model)を編集する

論理削除を行う対象のモデルに以下の一行を追加します。

acts_as_paranoid

これだけで論理削除が導入できます。

削除コマンドとその他のコマンド

削除コマンド

例えば登録ユーザーを削除したい場合を想定すると、

user.destroy

と書けば論理削除されます。
物理削除したい場合は、

user.really_destroy!

と書きます。

データの復元

こちらも登録ユーザーを想定した場合、

user.restore

で論理削除したデータを復元できます。

削除データの確認

論理削除したデータを確認したい場合は、Userモデルがあったとして、

User.only_deleted

で確認できます。

最後に

論理削除を実装する方法としては上記のgemを使った方法が一番楽だと思います。

論理削除と物理削除のどちらを選ぶかはケースバイケースなので状況に応じて使い分けましょう。

それでは、また!

Follow me!