開発備忘録 2018/10/18

acts_as_paranoid で Rails に soft delete を追加する

ActiveRecorddestroy は物理削除でモデルを削除しようとします。
acts_as_paranoid という gem を使うことでこの挙動を論理削除に変えることができます。

github.com

使い方は非常にシンプルでモデルに acts_as_paranoid を追加するだけ。

class Paranoiac < ActiveRecord::Base
  acts_as_paranoid
end

これにより、destroy を呼び出すと物理削除ではなく、deleted_at カラムに timestamp を記録するような挙動に変わります。
ちなみに deleted_at 以外のカラムも指定可能で、また型も time 以外にも booleanstring を指定することが可能です。

destroy の挙動の変化以外にも default_scopedeleted_at が NULL 以外を取得するようになります。
削除済みのレコードも取りたい場合は Paranoiac.with_deleted で取得が可能です。

この他にも色々機能があるみたいですが、それはまた追々記事していこうかと思います。

ところで acts_as_paranoid と似たような機能を提供する gem に paranoia というものがありますね。

github.com

Paranoia is a re-implementation of acts_as_paranoid for Rails 3/4/5

と書いているのでたぶん paranoia の方が後発だけど、いまは acts_as_paranoid も Rails 4/5 サポートしてますし、結局どっちがいいんでしょう……。