😇

【Rails】Discardで論理削除したデータも扱いたいとき

2023/10/06に公開

はじめに

  • Discardを使用して論理削除を表示したくない時は下記のような記述をすると思います
class Post < ApplicationRecord
  include Discard::Model
  default_scope -> { kept }
end
 @post = Post.all
  • しかし、論理削除のデータをその他の画面や機能で使用したいときがあると思います
  • その方法について解説します

結論

  • アプローチとしては 「論理削除済みデータを表示したくない部分を限定する」 という方法です
  • model側で
class Post < ApplicationRecord
  include Discard::Model
  scope :active, -> { kept }
end
  • 表示させたくないcontroller側で
 @post = Post.active.all
  • この方法で、論理削除済みのデータを使用したい場面では
 @post = Post.all
  • とすることで論理削除済みのデータも扱うことができます

scope :active, -> { kept } の解説

scope

概要

  • RailsのActiveRecordモデルで使用されるクラスメソッドの一つです。
  • 主な目的は、特定のクエリを名前付きのメソッドとして定義して再利用可能にすることです。
  • コードの可読性を上げるためや、繰り返し同じクエリを書く手間を省くために使用されます。

使い方

  • 基本
scope :スコープ名, -> (引数) {クエリの内容}
  • 使用例
  • 例えば、publishedというbooleanカラムを持つArticleモデルがあるとします。
scope :published, -> { where(published: true) }
@article = Article.published

kept

概要

  • keptはDiscardというgemが提供しているメソッド
  • 論理削除されていないレコード(discard_columnがnil)だけを取得するためのクエリです
model.rb
    included do
      class_attribute :discard_column
      self.discard_column = :discarded_at

      scope :kept, ->{ undiscarded }
      scope :undiscarded, ->{ where(discard_column => nil) }
      scope :discarded, ->{ where.not(discard_column => nil) }
      scope :with_discarded, ->{ unscope(where: discard_column) }

      define_model_callbacks :discard
      define_model_callbacks :undiscard
    end

今回の場合

scope :active, -> { kept }
  • と定義し
 @post = Post.active.all
  • 「active」を指定すると「kept」が働くという仕組みでした

Discussion