1. ホーム
  2. ruby-on-rails-3

[解決済み] モデルで `save` と `save!` はいつ使うのか?

2022-02-08 22:38:01

質問

によると セーブ・バンギング・ユア・ヘッド、アクティブ・レコードはあなたを狂わせます の使用は避けるべきです。 save!rescue イディオムは、例外的な状況のために用意されています。そう考えると、例えば、あるモデルが @post.mark_rejected .

のコードが mark_rejected 以下の問題のいずれかが原因で失敗した場合、例外を発生させるべきでしょうか?

  • バリデーションに問題がある場合
  • NullableでないフィールドにNullが代入されていた場合
  • データベースへの接続が切断された場合

例外を投げない場合は

  • の戻り値をチェックする必要があります。 mark_rejected を実行します。
  • そのメソッド呼び出しから例外が発生することは想定していませんので、そのような場合は rescue そのため、例外は (...where...) と表示され、おそらく何らかの (500 HTTP?) エラーとして表示されるでしょう。

コード例です。

def mark_rejected
  ...
  save!
end

または

def mark_rejected
  ...
  save
end

解決方法は?

例外が発生するとオーバーヘッドが増えるので、パフォーマンスの問題があります。 save .

例外をレスキューするよりも、戻り値がfalseかどうかをチェックする方がコード行数が少ないので、すでに例外をレスキューしている場合に戻り値をチェックしなければならないことが問題になるとは思えませんが、どうでしょうか。が投げる例外はどれくらいの頻度で発生するのでしょうか? save! 実際にコールスタックをバブルアップしなければならないことがあるでしょうか?私の経験では、めったにないことです。

を呼び出す際に例外が発生した場合 save とは対照的に save! 500エラーページを表示させる必要があります。これは、回復不可能な、未知の、予期しない内部サーバーエラーが発生したことを意味します。