find_or_create_byメソッドとは
引数に条件を指定して、その条件に当てはまるレコードがあれば初めの一件を取り出します。(find)
当てはまるレコードがなければ、一件作成します。(create)
*createなので、newと違いレコードを保存してくれます。
モデル名.find_or_create_by(条件)
参考例
当てはまるレコードがある場合
[1] pry(main)> User.find_or_create_by(name: '田中')
User Load (22.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = '田中' LIMIT 1
=> #<User:0x000000011610d080 id: 1, name: "田中", age: 23, gender: "men", created_at: Fri, 19 Nov 2021 10:15:21.806163000 UTC +00:00, updated_at: Fri, 19 Nov 2021 10:15:21.806163000 UTC +00:00>
name: ‘田中’に当てはまる最初のレコードを取り出せました。
ない場合
[4] pry(main)> User.find_or_create_by(name: '加藤')
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`name` = '加藤' LIMIT 1
TRANSACTION (0.3ms) BEGIN
User Create (1.3ms) INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('加藤', '2021-11-29 17:55:12.691067', '2021-11-29 17:55:12.691067')
TRANSACTION (1.2ms) COMMIT
=> #<User:0x0000000116416f10 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>
ない場合は、name: ‘加藤’をもつレコードを新しく作り出すことができました。