開発備忘録 2018/10/18
acts_as_paranoid で Rails に soft delete を追加する
ActiveRecord の destroy
は物理削除でモデルを削除しようとします。
acts_as_paranoid という gem を使うことでこの挙動を論理削除に変えることができます。
使い方は非常にシンプルでモデルに acts_as_paranoid
を追加するだけ。
class Paranoiac < ActiveRecord::Base acts_as_paranoid end
これにより、destroy
を呼び出すと物理削除ではなく、deleted_at
カラムに timestamp を記録するような挙動に変わります。
ちなみに deleted_at
以外のカラムも指定可能で、また型も time
以外にも boolean
や string
を指定することが可能です。
destroy
の挙動の変化以外にも default_scope
は deleted_at
が NULL 以外を取得するようになります。
削除済みのレコードも取りたい場合は Paranoiac.with_deleted
で取得が可能です。
この他にも色々機能があるみたいですが、それはまた追々記事していこうかと思います。
ところで acts_as_paranoid と似たような機能を提供する gem に paranoia というものがありますね。
Paranoia is a re-implementation of acts_as_paranoid for Rails 3/4/5
と書いているのでたぶん paranoia の方が後発だけど、いまは acts_as_paranoid も Rails 4/5 サポートしてますし、結局どっちがいいんでしょう……。