LoginSignup
20
21

More than 5 years have passed since last update.

rails3_acts_as_paranoidで論理削除

Last updated at Posted at 2012-05-02

Rails 3.2.2、rails3_acts_as_paranoid 0.2.2、SQLite3にて確認。

インストール

Gemfile
gem 'rails3_acts_as_paranoid'
bundle install

設定

削除の判定に使用する列を追加する。
deleted_at:timestampがデフォルト。

rails g migration add_deleted_at_to_hoges deleted_at:timestamp
rake db:migrate

モデルでrails3_acts_as_paranoidの使用を宣言。

app/models/hoge.rb
class Hoge < ActiveRecord::Base
  acts_as_paranoid

以上の作業のみで使用可能となる。

論理削除

Hoge.find(1).destroy

物理削除

Hoge.find(1).destroy!

もしくは一度destroyしたレコードに対し再度destroyを実行する。

論理削除されたレコードのみ抽出

Hoge.only_deleted

論理削除されたレコードも含めて抽出

Hoge.with_deleted

復元

Hoge.only_deleted.where(id: 1).recorver

deleted_atの型を変える

add_column :hoge, :deleted_at, :boolean, null: false, default: false
app/models/hoge.rb
class Hoge < ActiveRecord::Base
  # 'boolean'はシンボルでは指定できない
  # date、stringも指定できる
  acts_as_paranoid column_type: 'boolean'

deleted_atはデフォルトだと日付型。
抽出時にdeleted_at IS NULLとなるのが嫌だったのでbooleanにしようとしたけど、変更後もdeleted_at IS NULLだったのでデフォルトのままとした。

またdeleted_at IS NULLで抽出するので当然、NOT NULL制約は使用できない。

使用する列名を変更する

app/models/hoge.rb
class Hoge < ActiveRecord::Base
  acts_as_paranoid column: 'hogehoge'

関連するモデルの削除

has_many :hogehoge, dependent: :destroy

とある場合、参照先でもacts_as_paranoidを使用しているなら論理削除。
使用していないなら物理削除。

この後、recoverを実行すると関連するモデルも復元される。
復元したくない場合は:recover_dependent_associationsオプションにfalseを設定する。

validatesのuniqueness

論理削除も考慮する場合は、下記を使用する。

validates_as_paranoid
validates_uniqueness_of_without_deleted :name

使用上の注意

開発途中で追加するとrake db:migrate時にdeleted_atが無いために失敗することがある。
その場合は一時的にacts_as_paranoidをコメントアウトなどして再度、実行すること。

20
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
21