【Rails】find_or_initialize_byメソッドの使い方や具体例を解説

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>]

先ほど作った’山田’はないことがわかります。

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