カクカクしかじか

技術的なアレコレ

mongoidのfind_or_initialize_byメソッド

はじめに

find_or_initialize_by メソッドを知らなかった自分用メモに投稿させて頂きます。
なお、mongoidのコンソールログは量が多いので割愛し、ActiveRecordの例の時だけコンソールの表示を記載してあります。

find_or_initialize_byとは?

存在したらそのデータを返し、存在しない場合はnewするメソッドです!

使用例

更新系の処理で使う場合が多そうです!

user = User.find_or_initialize_by(email: email, user_id: current_user.id)
# なんらかの値の設定
user.save

ActiveRecordの場合

mongoidじゃなくActiveRecordにも同様のメソッドがありました!

task = Task.find_or_initialize_by(name: "hoge")
  Task Load (15.8ms)  SELECT  "tasks".* FROM "tasks" WHERE "tasks"."name" = $1 LIMIT $2  [["name", "hoge"], ["LIMIT", 1]]
=> #<Task:0x00007fb1459ca060 id: nil, name: "hoge", description: nil, created_at: nil, updated_at: nil>
[1] pry(main)> task.save
   (0.3ms)  BEGIN
  Task Create (40.9ms)  INSERT INTO "tasks" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["name", "hoge"], ["created_at", "2019-03-19 15:26:21.741391"], ["updated_at", "2019-03-19 15:26:21.741391"]]
   (12.2ms)  COMMIT
=> true
[2] pry(main)> task = Task.find_or_initialize_by(name: "hoge")
  Task Load (0.4ms)  SELECT  "tasks".* FROM "tasks" WHERE "tasks"."name" = $1 LIMIT $2  [["name", "hoge"], ["LIMIT", 1]]
=> #<Task:0x00007fb1460ffa60
 id: 1,
 name: "hoge",
 description: nil,
 created_at: Tue, 19 Mar 2019 15:26:21 UTC +00:00,
 updated_at: Tue, 19 Mar 2019 15:26:21 UTC +00:00>