LoginSignup
2
0

find_or_initialize_byメソッドとfind_or_create_byメソッドについて

Last updated at Posted at 2023-10-25

実行環境は以下の通り

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] =  "お気に入りに登録しました"

でも今回は、find_or_initialize_byメソッドを使用しました。理由は、flashメッセージにあります。もし、find_or_create_byメソッドで書いてしまった場合、お気に入り登録してなければflashメッセージが出てもいいのですが、もし、お気に入り登録をしていたらfind_or_create_byではflashメッセージは単体で書いているので、問い合わせをするたびに「お気に入りに登録しました」と出てきてうるさいから、find_or_initialize_byメソッドで最初に存在するか調べて、もしあったらunless favorite.persisted? のところがfalseになって中を実行しないのでメッセージは最初の1回のみしか出ないのでこちらを採用しました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0