はじめに
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>