論理削除という単語を学んだので、Rails でやってみる。
目次
論理削除とは
論理削除とは?という答えのためには「物理削除」とは?を理解している必要がありました。
ということで以下の通り理解しました。
- データベースのデータを本当に消してしまうのが「物理削除」
- データに「削除したってことにするフラグを立てる」のが「論理削除」
自前でやってみる
任意のディレクトリで以下の通り実行して、準備する。
モデルの作成
1 | bundle exec rails g scaffold user name:string deleted:boolean |
モデルの修正
app/models/user.rb を以下のように修正する。
1 |
|
コントローラの修正
app/controllers/users_controller.rb を以下のように修正します。
先に作った active をはさむ形で、.all と.find を実行するようにし、
destroy アクションは、deleted カラムを true に書き換えます。
1 | class UsersController < ApplicationController |
ビューの修正
deleted カラムを表示、入力項目にしないように修正。
1 | <%= form_with(model: user, local: true) do |form| %> |
上記に加え以下 2 つを編集する。
- app\views\users\index.html.erb
- app\views\users\show.html.erb
確認
bundle exec rails s
で実行し、localhost:3000/users にアクセスする。
いつもの画面になっている。
適当にデータを追加して、削除してみる。
見た目ではデータが消えているように見える。
rails コンソールで確認してみる。
1 | bundle exec rails c |
確かに、deleted が true になっていて、実データが保存されている。
論理削除ができた。
gem でやってみる
論理削除を実現するための gem は様々あるそうです。
今回は、github のスターが多かったparanoiaを導入してみます。
(しかし、paranoia って穏やかな名前じゃないな。)
paranoia の導入
Gemfile に以下の通り追記。
1 | gem "paranoia", "~> 2.2" |
追記出来たら、bundle install
を実行。
モデルの作成 2
以下コマンドで、モデルの作成とカラムの追加を実施。
1 | # モデルの作成 |
モデルの修正 2
app/models/guest.rb を通り修正し、acts_as_paranoid
を記述し以下のようにする。
1 | class Guest < ApplicationRecord |
確認 2
bundle exec rails s
で実行し、localhost:3000/guests にアクセスする。
いつもの画面になっている。
適当にデータを追加して、削除してみる。
今回は 2 件登録して 1 件だけ削除しています。
見た目ではデータが消えているように見える。
rails コンソールで確認してみる。
1 | bundle exec rails c |
あれ?全件出てこないと思ったが、WHERE "guests"."deleted_at" IS NULL LIMIT
が SQL に挿入されていた。
全件取得には.with_delete
を使うそうだ。
1 | irb(main):002:0> Guest.with_deleted |
deleted_at に値が入ったものと、nil のものが確認できました。
paranoiaには、論理削除から元に戻す.restore
なども用意されていました。
自前で作った時と大きく違うのは、既存のメソッド.All
や.destroy
をオーバーライドすることです。
論理削除を意識せずに使えるけど、消したつもりで消えてないなんてこともありそうなので気を付けて使用する必要がありそうです。
今回は論理削除を 2 種類の方法でやってみました。
自前でやってみて基本原理の確認、gem で便利なオーバーライドを確認しました。
これまで削除するときには、物理削除しか知らなかったのでしっかり消してきましたが今後は論理削除を頭においておきます。
ではでは。