Active Recordのdeleteとdestroy


RailsのActive Record(モデル)のdestroydeleteについての紹介です。

🎳 destroy_allについて

destroy_allは条件にマッチするレコードを関連テーブルも含めて削除します。
Active Recordのオブジェクトを解するので、1行ずつ削除されます。

😼 delete_allについて

delete_allはSQLのDELTE文を流します。そのため、関連テーブルの削除は行いません。
まとめてDELTEのSQLを実行するため、削除の効率はよいです。

🐞 destroyでバリデーションを行う

destroy実行前にバリデーションを行う場合はbefore_destroyのコールバックを使います。

class Article < ActiveRecord::Base
before_destroy def check_publish
errors.add :base, '公開中の場合は記事を削除できません' if published?
return false
end
end
end

これで、destroyの実行時に処理を分岐できます。

if @article.destroy
redirect_to articles_path, notice: '削除しました'
else
render :show, notice: '削除できませんでした'
end

🚌 参考リンク

📚 おすすめの書籍