Open12

ActiveRecordのpersisted?のコードリーディング

ksaitoksaito

ふと、どうやってpersisted?new_record?の判定が行われているか気になったのでactive_recordのコードを読んでわかったことをつらつらと書いていきます。

ksaitoksaito

@new_recordの初期値はどこで決まっているかを追うと、インスタンス作ったときにtrueをセットしている
https://github.com/rails/rails/blob/v7.2.0/activerecord/lib/active_record/core.rb#L443-L462

ksaitoksaito

じゃあ、DBにコミットしたらfalseに変わるのかな?

ksaitoksaito

これが実装されているところはよくわからんな...

ksaitoksaito

DBにコミットした時点でfalseにならないのは、インスタンスとDBに永続化したデータは別物として扱っていて、reloadが成功したかで判断したほうが厳密だからか

ksaitoksaito

次は@destroyedを追っていく

ksaitoksaito

@new_recordと違って、インスタンス作ったときにfalseをセットしてないんだな...

ksaitoksaito

こうして調べてみると、知らないメソッドを発見できるからいいな。
previously_new_record?destroyed?とか使ったことない気がする。