Ruby on Railsにおけるデータ削除
Author: 水卜
Author: 水卜
ActiveRecordで用意されているデータ削除のメソッドの種類、destroyとdestroy!の違いなどをメモ。
destroy
delete
destroy_all
delete_all
destroy!
ActiveRecordを介した削除。
Modelにdependent: destroyが設定されていれば関連レコードも削除してくれる。
class User < ApplicationRecord
has_many :blogs, dependent: :destroy
end
class Blog < ApplicationRecord
belongs_to :user
end
ActiveRecordを介さない削除。
関連レコードも消さない。
複数レコードにdestroyを掛ける
User.first.posts.destroy_all
User.firstに紐づくpostsは関連レコードごと消えるが、User.firstは消えない。
複数レコードにActiveRecordを介さない削除。
普通のdestroyは削除されたらtrue(削除されたインスタンス)を、できなければfalseを返す。
destroy!は削除できなかった場合、ActiveRecord::RecordNotDestroyed
を投げる。
特定の条件で削除を中断したい時に使える。
以下のように、before_destroyでthrow :abort
すると削除に失敗したとされ、destroy!が例外を投げる。
class User < ApplicationRecord
before_destroy :should_not_destroy_admin
private
def should_not_destroy_admin
if role == admin?
throw :abort
end
end
end