【Rails】find_or_create_byメソッドの使い方や具体的な使用例を解説

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: ‘加藤’をもつレコードを新しく作り出すことができました。

タイトルとURLをコピーしました