Subscribed unsubscribe Subscribe Subscribe

Rails4.2における論理削除(soft-delete)用gemについて

論理削除をRailsに導入する場合は以下のgemが候補に上がると思います。

github.com

github.com

個人的にはソースの変更が極力少ないparanoiaがいいかなと思います。

なお、設定は以下の通りです。

model

acts_as_paranoid

deleted_atカラムを追加する

$ rails g migration AddDeletedAtToテーブル名 deleted_at:datetime:index
$ bundle exec rake db:migrate

論理削除について

個人的には論理削除にはあまり好意的に考えてはいません。  
deleteして、再度insertした方が望ましいと考えています。  
オーバーヘッドや運用の手間が一番少なくすることを第一だからです。  

休眠データのほとんどはゴミデータでそんなに流動しないので、  
deleteして、再度insertしても問題ありません。  

間違えて、データを削除してしまったときの復旧を考えて論理削除しているかもしれませんが、  
定期的にスナップショットを取るように設定すれば済むことです。

それでは復活するかもしれないデータとはどのようなものでしょうか。 以下のような例があると思います。 * 復活するかもしれないデータ

退会したユーザーとそのユーザーに関連する投稿等
契約がきれた会社のデータ
年に1ヶ月間のみ掲載する物件や店舗の情報

また、復活するかもしれないデータに対する対応策は3つあると思います。

  • 論理削除
データを残し続けます
select時に対象から除外させるようにします
select時のオーバーヘッドが発生します
※データの入れ替わりが激しい場合はより休眠データが多くなってしまいます
  • 休眠データ用のテーブルを作成する
データを休眠データ用のテーブルにinsertした後にdeleteする
deleteの前にinsertのオーバーヘッドがあります。
insertに失敗したときにdeleteできない場合は面倒です
  • deleteして、復活する際には新たにinsertする
deleteする際に関連するデータが全て削除されますがよろしいでしょうかとの通知をする
再度ユーザー登録した場合や契約した場合は新たにゼロからinsertしていく