はじめに

gemを実装しなくとも論理削除は実装可能ですが、railsライクで論理削除gemのparanoiaを導入して、レコードの論理削除を実装します。
動作としては削除日時(deleted_at)カラムを用意して削除するときに、deleted_atに日時を入れてくれるというものです。この状態でレコードを表示すると、削除されたレコードは抽出対象にならずに表示してくれます。

paranoiaの導入

詳細については以下のリポジトリreadmeを参照ください

gemリポジトリ:
https://github.com/radar/paranoia

paranoiaインストール

Gemfileにparanoiaの定義を記述

gem "paranoia"

反映

bundle install

論理削除用のカラムをテーブルへ追加

論理削除にparanoiaが使用するカラムを用意します。paranoiaではこのカラムを使用してSQLを発行するのでindexを一緒に速度を考慮してつけておきます。

例)Usersテーブルへ論理削除用のdeleted_atカラムを追加します※index込み

rails generate migration AddDeletedAtToUsers deleted_at:datetime:index

マイグレーションファイルの中身は以下のとおりです

class AddDeletedAtToUsers < ActiveRecord::Migration
 def change
  add_column :users, :deleted_at, :datetime
  add_index :users, :deleted_at
 end
end

テーブルへ反映します

rake db:migrate

対象テーブルのModelへparanoia機構を反映

対象のテーブルのModelへparanoia設定をします

例)UsersテーブルのModelへ設定します

class Users < ActiveRecord::Base
 acts_as_paranoid
end

このときもしもparanoiaのデフォルトのdeleted_atでなく、別の名前のカラム名にした場合は以下のようになります

class Users < ActiveRecord::Base
 acts_as_paranoid column: :任意のカラム名
end

paranoiaの使い方

paranoiaを導入したところで、実際にデータを論理削除を行い、テーブルの参照を行って表示されないことを確認してみます。

メソッドの詳細系はreadmeを参照ください

gemリポジトリ:
https://github.com/radar/paranoia

テーブルからレコードの論理削除

テーブルのレコードを削除します
例)UsersテーブルのID「1」のレコードを削除します

user = Users.find(1)
user.destroy

ここで発行されているSQLは以下の通りです

update users set updated_at = ’2015-07-23 00:00:00′, deleted_at = ’2015-07-23 00:00:00′ where id = 1

テーブルのレコード一覧を確認

正しく削除されているか確認します

Users.all

※ID「1」が表示されていなければOKです

ここで発行されているSQLは以下の通りです

select * from users where deleted_at is null

テーブルから削除したレコードインスタンスの確認

削除したインスタンスの状態を確認します

user.deleted_at

※削除した日時が表示されていればOKです

テーブルの削除レコードを含むレコードの一覧を確認

削除したレコードも含み全体を確認します

Users.with_deleted

※ID「1」とその他レコードが表示されていればOKです

ここで発行されているSQLは以下の通りです

select * from users

テーブルの削除したレコードの一覧を確認

削除したレコードを確認します

Users.only_deleted

※ID「1」が表示されていればOKです

ここで発行されているSQLは以下の通りです

select * from users where deleted_at is not null

テーブルからレコードの物理削除

paranoiaを導入したことにより、論理削除を強制としますが、それでも物理削除をしたい場合もあります。
その場合はdestoyメソッドに!をつけてdestory!を実行すると物理削除になります。

その他おすすめの備忘録

Tagged with:
 

2 Responses to [Rails]Rails4へ論理削除gemのparanoiaを導入する

  1. babababand より:

    “paranoia”

  2. kasumani より:

    Rails4へ論理削除gemのparanoiaを導入する はじめに gemを実装しなくとも論理削除は実装可能ですが、railsライクで論理削除gemのparanoiaを導入して、レコードの論理削除を実装します。 動作としては削除日時(deleted_at)カラムを用意

コメントを残す