【Rails】find_or_create_byとfind_or_initialize_byの違いを徹底比較

find_or_create_byとfind_or_initialize_byの違い

どちらも、①条件に当てはまるレコードがあれば、その最初のレコードを一件取り出します。(find)

条件に当てはまるレコードがなければ、一件レコードを作成します。(create,initialize)

違いは②にあります。

createは、new + save なので、作成+データベースに保存してくれます。 

initializeは、newのみなので、作成だけで保存はしません

使用場面

find_or_create_by

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

 User.find_or_create_by(name: '加藤')

name: ‘加藤’というレコードがあれば取得、なければ新しく作成し保存します。

find_or_initialize_by

find_or_create_byは、新規作成の場合のみ処理を行いたい場合使えないので、そのような場合はfind_or_initialize_byを使います。

user = User.find_or_initialize_by(name: '田中')
if user.new_record? 
  user.save
end

上記は、name: ‘田中’が存在する場合はレコードを取り出しますが、なければ作成します。

ただinitializeは保存しないので、if文で新規作成のレコードであれば保存するという処理を記述しています。

new_record?で新規作成のレコードに対して行いたい処理を書けばOKです。

タイトルとURLをコピーしました