【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

など


他にもスコープの変更、論理削除用のカラム名の変更、コールバックなどもあるようですが、その辺りはまた触ることがあれば追記していきます。

参考文献

github.com