[解決済み] モデルで `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エラーページを表示させる必要があります。これは、回復不可能な、未知の、予期しない内部サーバーエラーが発生したことを意味します。
関連
-
[解決済み] pg gem をインストールしようとすると 'libpq-fe.h' ヘッダが見つからない
-
[解決済み] モデルで `save` と `save!` はいつ使うのか?
-
[解決済み] Railsのインストール時に「/usr/binディレクトリに書き込み権限がありません」というエラーが発生しますが、どのように修正すればよいですか?
-
[解決済み] SocketError (getaddrinfo: Name or service not known) - Sunspot/Solr Rails development
-
[解決済み] Rails update_attributes without save?
-
[解決済み】Rails - コントローラの内部でヘルパーを使用する方法
-
[解決済み】Railsのhas_one/has_manyの:sourceオプションについて理解する。
-
[解決済み】Rails: モデルがすでに存在するときに`rails generate scaffold`を実行するにはどうすればよいですか?
-
[解決済み] 新しいRailsアプリを作成するときに、test-unitではなくRSpecを使用するようにRailsに指示するにはどうすればよいですか?
-
[解決済み] Railsで "has_many :through "リレーションはいつ使うのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] モデルで `save` と `save!` はいつ使うのか?
-
[解決済み] Rails 3 - link_to を image_tag + text で表示する。
-
[解決済み] Railsマイグレーションで、既存のテーブルにカラムを追加する
-
[解決済み] SocketError (getaddrinfo: Name or service not known) - Sunspot/Solr Rails development
-
[解決済み] Herokuのデータベースを空にする方法
-
[解決済み] REST JSON APIのサーバーとクライアントを分離?[クローズド]
-
[解決済み】rmagick gem install "Can't find Magick-config"...
-
[解決済み】Railsのhas_one/has_manyの:sourceオプションについて理解する。
-
[解決済み] 新しいRailsアプリを作成するときに、test-unitではなくRSpecを使用するようにRailsに指示するにはどうすればよいですか?
-
[解決済み] 既存のRailsカラムのbooleanに:default => trueを追加する。