[Rails]find_or_create_byとfind_or_initialize_by


Rails4で確認。

オブジェクトが存在する場合は取得、なければ作成、ということがしたい場合にfind_or_create_byが使うと便利です。

user = User.find_or_create_by(uid: 'sample') # uid = 'sample' のユーザが存在する場合は取得、しなければ新規保存

ですが、find_or_create_byだと新規作成の場合のみ特定の処理をさせたい、といった場合にnew_recordなのかどうか区別がつきません。

その場合は、find_or_create_byではなくfind_or_initialize_byを使います。

user = User.find_or_initialize_by(uid: 'sample') # uid = 'sample' のユーザが存在する場合は取得、しなければ新規作成(未保存)
if user.new_record? # 新規作成の場合は保存
  user.save!
  # 新規作成時に行いたい処理を記述
end

new_record?を使うと新規作成かどうかが区別できるので、新規作成時のみ特定の処理を行うことが可能になります。

参考