find_or_initialize_byメソッドとは
条件を引数で指定して、その条件に当てはまるレコードがあれば、その初めの一件を取り出します。(find)
当てはまるレコードがなければ、一件レコードを作成します。(new)
*newなので、レコードは作成しますが保存はしてくれません。
参考例
条件に当てはまるレコードがある場合
[6] pry(main)> User.find_or_initialize_by(name: '田中')
User Load (2.0ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = '田中' LIMIT 1
=> #<User:0x00000001164b8360 id: 2, name: "田中", age: nil, gender: nil, created_at: Mon, 29 Nov 2021 17:57:16.796566000 UTC +00:00, updated_at: Mon, 29 Nov 2021 17:57:16.796566000 UTC +00:00>
name: ‘田中’に当てはまる最初のレコードを取り出すことができました。
ない場合
[7] pry(main)> User.find_or_initialize_by(name: '山田')
User Load (1.6ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = '山田' LIMIT 1
=> #<User:0x0000000116574380 id: nil, name: "山田", age: nil, gender: nil, created_at: nil, updated_at: nil>
name: ‘山田’に当てはまるレコードがないため、新しくレコードを作成することができました。
作成はnewで行っているため、データベースを見てみると、
[8] pry(main)> User.all
User Load (0.5ms) SELECT `users`.* FROM `users`
=> [#<User:0x00000001255b8dc8 id: 1, name: "加藤", age: nil, gender: nil, created_at: Mon, 29 Nov 2021 17:55:12.691067000 UTC +00:00, updated_at: Mon, 29 Nov 2021 17:55:12.691067000 UTC +00:00>,
#<User:0x00000001255b8c38 id: 2, name: "田中", age: nil, gender: nil, created_at: Mon, 29 Nov 2021 17:57:16.796566000 UTC +00:00, updated_at: Mon, 29 Nov 2021 17:57:16.796566000 UTC +00:00>]
先ほど作った’山田’はないことがわかります。