Ruby on Railsにおけるデータ削除
 Author: 水卜

ActiveRecordで用意されているデータ削除のメソッドの種類、destroyとdestroy!の違いなどをメモ。

レコード削除の種類

  • destroy

  • delete

  • destroy_all

  • delete_all

  • destroy!

destroy

ActiveRecordを介した削除。

Modelにdependent: destroyが設定されていれば関連レコードも削除してくれる。

class User < ApplicationRecord
  has_many :blogs, dependent: :destroy
end

class Blog < ApplicationRecord
  belongs_to :user
end

delete

ActiveRecordを介さない削除。

関連レコードも消さない。

destroy_all

複数レコードにdestroyを掛ける

User.first.posts.destroy_all

User.firstに紐づくpostsは関連レコードごと消えるが、User.firstは消えない。

delete_all

複数レコードにActiveRecordを介さない削除。

destroy!

普通の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