はじめに
Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。
論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。これにより、削除されたレコードを後から復元することが可能となり、データの整合性と安全性が向上します。
この記事では、Paranoiaの概要と、Railsでの使用方法について解説します。
Paranoiaについて
Paranoiaは、以下の機能を提供します。
- 論理削除:レコードを物理削除する代わりに、
deleted_at
カラムにタイムスタンプを記録する - 自動スコープ:デフォルトで、論理削除されていないレコードのみをクエリに含める
- 復元:論理削除されたレコードは簡単に復元可能
使用方法
インストール
まず、Gemfile
にParanoiaを追加し、bundle install
を実行してインストールします。
Gemfile
gem 'paranoia', '~> 2.4'
モデルの設定
Paranoiaを使用するためには、モデルでParanoiaを有効にする必要があります。以下は、Article
モデルにParanoiaを設定する例です。
app/models/article.rb
class Article < ApplicationRecord
acts_as_paranoid
# その他のモデルの設定
end
マイグレーションの追加
Paranoiaは論理削除のためにdeleted_at
カラムを必要とします。次に、deleted_at
カラムを追加するためのマイグレーションを作成します。
% rails generate migration AddDeletedAtToArticles deleted_at:datetime:index
生成されたマイグレーションファイルを以下のように編集します。
db/migrate/yyyymmddhhmmss_add_deleted_at_to_articles.rb
class AddDeletedAtToArticles < ActiveRecord::Migration[7.0]
def change
add_column :articles, :deleted_at, :datetime
add_index :articles, :deleted_at
end
end
マイグレーションを実行します。
% rails db:migrate
基本的な使い方
Paranoiaを有効にしたモデルでの基本的な操作方法を以下に示します。
レコードの論理削除
article = Article.find(1)
article.destroy
# => レコードは物理削除されず、deleted_atが設定される
削除済みレコードのスコープ
articles = Article.all
# => 削除されていないレコードのみが返される
削除済みレコードを含むクエリ
all_articles = Article.with_deleted
# => 削除済みレコードも含んだレコードが返される
削除済みレコードの取得
deleted_articles = Article.only_deleted
# => 削除済みレコードのみが返される
削除済みレコードの復元
article = Article.only_deleted.find(1)
article.restore
# => deleted_atがnilに設定され、レコードが復元される
実践的な例
例えば、ブログで記事を管理する場合、Paranoiaを使用して記事を論理削除し、必要に応じて復元することができます。
モデルの設定
app/models/article.rb
class Article < ApplicationRecord
acts_as_paranoid
validates :title, presence: true
validates :content, presence: true
end
コントローラーの設定
app/constollers/articles_controller.rb
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
def show
@article = Article.find(params[:id])
end
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article, notice: '記事が作成されました。'
else
render :new
end
end
def edit
@article = Article.find(params[:id])
end
def update
@article = Article.find(params[:id])
if @article.update(article_params)
redirect_to @article, notice: '記事が更新されました。'
else
render :edit
end
end
def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to articles_url, notice: '記事が削除されました。'
end
private
def article_params
params.require(:article).permit(:title, :content)
end
end
ビューの設定
削除済みの記事を表示するためのリンクを追加できます。
app/views/articles/index.html.erb
<% @articles.each do |article| %>
<h2><%= link_to article.title, article %></h2>
<p><%= article.content %></p>
<%= link_to '編集', edit_article_path(article) %> |
<%= link_to '削除', article, method: :delete, data: { confirm: '本当に削除しますか?' } %>
<% end %>
削除済みの記事を一覧表示し、復元するためのビューを追加します。
app/views/articles/index.html.erb
<h1>削除済みの記事</h1>
<% @deleted_articles.each do |article| %>
<h2><%= article.title %></h2>
<p><%= article.content %></p>
<%= link_to '復元', restore_article_path(article), method: :patch %>
<% end %>
まとめ
Paranoiaは、Railsアプリケーションにおいて論理削除を簡単に実装するためのGemです。データを物理的に削除することなく削除済みとして扱うことで、データの復元が容易になります。
この記事では、Paranoiaの概要と使用方法を紹介しました。実際のプロジェクトで論理削除が必要な場合には、Paranoiaを活用してデータの安全性と柔軟性を確保しましょう。