実行環境は以下の通り
ruby:3.0.1
rails:6.1.6
find_or_initialize_byメソッドとfind_or_create_byメソッドとは?
結論、find_or_initialize_byメソッドとfind_or_create_byメソッドは、ともに「条件を指定してそれが存在したら取得し、なかったら作る」というメソッドです。例えば、メルカリなどでいいねを押さずに直接商品に対して問い合わせた時に自動でお気に入りに登録しましたとメッセージがでて、お気に入りに追加され、その情報が保存されるイメージです。
find_or_initialize_byメソッドとfind_or_create_byメソッドの違いとは?
結論、新規生成後に保存するかしないかの違いです。
メソッド名 | 役割 |
---|---|
find_or_create_by | 保存する |
find_or_initialize_by | 保存しない |
find_or_create_byメソッドは保存までやってくれるのですが、find_or_initialize_byメソッドは生成するだけで保存はしません。なので保存したい時にはsaveを一緒に使ってあげると保存できます。
実際のコード
では、実際のコードを見ていきます。今回は犬猫取引アプリを作成しましたのでそこから持ってきました
例えば、お気に入り登録をせずにその動物に対して問い合わせた時にお気に入り登録をしたい時には以下のように書くことができます。
find_or_intialize_byでかいた場合は以下の通り
favorite = Favorite.find_or_initialize_by(user_id: current_user.id, animal_id: @animal.id)
unless favorite.persisted?
favorite.save
flash[:favorite] = "お気に入りに登録しました"
end
流れとしては、かっこの中に条件と引数を指定しており、favoritesテーブルの中から現在ログインしているuser_idと問い合わせしたい動物のidが一致しているレコードがあるか調べてあったらunnless文を実行しないでなかったらunless文の中身を実行します。
もちろん、find_or_create_byでも以下のように書くことができます
Favorite.find_or_created_by((user_id: current_user.id, animal_id: @animal.id)
flash[:favorite] = "お気に入りに登録しました"