Rails 3.2.2、rails3_acts_as_paranoid 0.2.2、SQLite3にて確認。
##インストール
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の使用を宣言。
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
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制約は使用できない。
##使用する列名を変更する
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
をコメントアウトなどして再度、実行すること。