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です。