save!とは
・モデル保存させるもの
・既存のデータベースは更新される
特徴
save!は常にバリデーションが走っている。
・常にバリデーションを走らせている。
・保存に失敗したら"ActiveRecord::REcordINvalid"が発生する。そしてレコードが保存されない。
しかし例外も
・validate: falseを指定するとsave!のバリデーションをスキップすることが可能
現在時間も保存する
・デフォルトによると"save!"は現在時刻を"updated_at/updated_on"属性もを設定する。
例外も
・"touch: false"を指定すればこれらのタイムスタンプは更新されない。
:touch
:touchオプションをtrueに設定すると、そのオブジェクトがsaveまたはdestroyされたときに、関連付けられたオブジェクトのupdated_atタイムスタンプやupdated_onタイムスタンプが常に現在の時刻に設定されます
出典 https://railsguides.jp/association_basics.html
save!に関するコールバックの一連
コールバック
コンピュータプログラム中で、ある関数などを呼び出す際に別の関数などを途中で実行するよう指定する手法のこと。
出典 https://ewords.jp/w/%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF.html
パーセントエンコーディング(書き方)
コールバックを書くと
%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%となるのかな?
もし"before_*"コールバックのいくつかが:abortを投げる(コールバックの停止)と
そのアクションはキャンセルされる。そしてsave!メソッドは例外"ActiveRecord::RecordNotSaved"を発生させる。
readonlyと印を付けられた属性は、もしレコードが更新される場合、静かに無視されます。
出典 見つけられなかった。
参考 deepL,Weblio
:abortを投げるとは? 検索してみた。
めぼしいサイトでサイト内の文字検索をかけてみたらそれっぽい説明があった。
実行を停止させる
あなたがモデルの新しいコールバックを登録し始めるとして彼ら(コールバック)はキューに入れられます。
このキューは登録されたコールバックそして実行されるためのデータベース操作の全てを含みます。
キュー(queue)待ち行列
キューとは、最も基本的なデータ構造の一つで、要素を入ってきた順に一列に並べ、先に入れた要素から順に取り出すという規則で出し入れを行うもの。順番を待つ人の行列と同じ仕組みであるため「待ち行列」とも訳される。
全体のコールバックチェーンは処理の中で包まれる。
もしいくつかのコールバックが例外が発生したら実行のチェーンが停止の状態になり、ロールバックが発行される。意図的にチェーンを停止させるには
throw :abortがある。
”ActiveRecord ;:Rollback"か"ActiveRecord::RecordInvalid"以外の例外は、Railsによってコールバックチェーンが停止された後、再び発生します。
思ったこと
”ActiveRecord ;:Rollback"か"ActiveRecord::RecordInvalid"以外に不備があった場合かな?
"ActiveRecord::Rollback"か"ActiveRecord::RecordInvalid"以外の一つ例外が発生すると、saveとupdateのようなメソッド達(標準的にtrueかfalseを返そうとする)が例外が発生することを予期していないコードを破壊するかもしれない。
出典 https://guides.rubyonrails.org/active_record_callbacks.html
使用サイト deepL,weblio
思ったこと
saveとupdateが予期しない例外が発生するとコードが破壊されることがあるのか。
なるほどそれでsave!やupdate!が存在するのか。
throw :abortは停止させるために使うのか。
思ったこと
和訳しながら理解することは大変だな。
少し理解できたからよかった。