😇
【Rails】Discardで論理削除したデータも扱いたいとき
はじめに
- 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