【Rails】Discardを使って論理削除を実装する
こんにちは。 Railsで論理削除を実装したい時に便利な「Discard」というgemを触る機会があり、使用したところを記録として残しておきたいと思います。
Discardとは?
A simple ActiveRecord mixin to add conventions for flagging records as discarded.
( by 公式Github )
とのことで「レコードに削除フラグを立てるための規約を追加する、シンプルなActiveRecordのmixin」です。 つまりは、より簡単に論理削除を実現するための仕組みやメソッドなどを提供してくれるGemであると受け取っています。
導入方法
① Gemfileに以下の記述を追加して、bundle install
gem 'discard', '~> 1.2'
② 論理削除を実装したいモデルにて以下のように記述
class Post < ActiveRecord::Base include Discard::Model end
③ マイグレーションファイル作成、ファイルに必要な記述を追加、マイグレーション実行
ターミナル
% rails generate migration add_discarded_at_to_posts discarded_at:datetime:index
生成したマイグレーションファイル
class AddDiscardToPosts < ActiveRecord::Migration[5.0] def change add_column :posts, :discarded_at, :datetime add_index :posts, :discarded_at end end
ターミナル
% rails db:migrate
以上です
どんなメソッドや機能が使えるのか
クラスメソッド
- kept 論理削除されていないレコードを配列で取得する
Post.kept # => [#<Post id: 1, ...>]
- discarded 論理削除されているレコードを配列で取得する
Post.discarded # => []
など
インスタンスメソッド
- discard 論理削除をおこなう(discarded_atカラムに日付のデータを入れる)
post = Post.find(1) post.discard # => true
- discarded? 論理削除済みならtrueを返す
post.discarded? # => true
- kept? 論理削除されていなければtrueを返す
post.kept? # => false
など
他にもスコープの変更、論理削除用のカラム名の変更、コールバックなどもあるようですが、その辺りはまた触ることがあれば追記していきます。