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

😀 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)