active recordのnew_record?とpersisted?の違い

tl;dr

  • new_record?はobjectが保存されていないときだけtrueを返します
  • persisted?はobjectが保存されていない、かつ今までに削除されていないときtrueを返します

new_record? vs persisted?

new_record?

最近Active Recordにnew_record?というmethodがあることを知りました

これは名前から想像がつくように、Objectが新規のものかそれとも既存のものかを判断してくれます

Objectがdatabaseに保存されていなければtrueが返ります

# User modelを新たに作成

user = User.new(name: "ichiro", age: "20")

user.new_record?
# true

user.save

user.new_record?
# false

結構便利ですね

新規作成フォームと編集フォームで表示を切り替えたいときなどに役にたちます

persisted?

ただこれ、persisted?というmethodでも同じことができます

trueとfalseは逆になります

# User modelを新たに作成

user = User.new(name: "ichiro", age: "20")

user.persisted?
# false

user.save

user.persisted?
# true

じゃあ何が違うんでしょうか?

違いは?

同じようなことを調べている人がたくさんいました

結論としては

  • new_record?はobjectが保存されていないときだけtrueを返します
  • persisted?はobjectが保存されていない、かつ今までに削除されていないときtrueを返します

sourceはかなり似てます

[https://github.com/rails/rails/blob/be3d9daaa39aa69603af16b602fe62ae47548469/activerecord/lib/active_record/persistence.rb#L424-L429:embed:cite]

条件は同じでnew_record?の方は保存されていなければ@new_record (おそらく保存前のオブジェクトが存在する場合true)を返します

persisted?は@new_recordがtrueまたは@destroyがtrue (これはobjectが削除されるとtrueが入ると思われる)、それ以外のときはfalseを返します

ちなみにpersistは固執する、持続するなどの意味があります

persisitだけで事足りてしまいそうな気がしますがそのうち使い分ける日が来るんだろうか