mergeメソッドのメモ
以下は、あるテーブルのデータと、そのテーブルの関連テーブルの外部キーを代入している。
しかし、処理が2行に分かれていて冗長。
@meal_record = current_user.meal_records.build(meal_record_params) @meal_record.food_id = params[:food_id]
mergeメソッドを使えば、かんたんに書ける。
@meal_record = current_user.meal_records.build(meal_record_params.merge(food_id: params[:food_id]))
ブロックでも書ける。
@meal_record = current_user.meal_records.build(meal_record_params) do |meal_record| meal_record.food_id = params[:food_id] end
変数の中身を確認してみる。
current_user.meal_records.build(meal_record_params) => #<MealRecord:0x00007f7fd4bf87f8 id: nil, meal_time: Sat, 31 Oct 2020 00:00:00 JST +09:00, created_at: nil, updated_at: nil, user_id: 2, food_id: nil> current_user.meal_records.build(meal_record_params.merge(food_id: params[:food_id])) => #<MealRecord:0x00007f7fd0fc4a98 id: nil, meal_time: Sat, 31 Oct 2020 00:00:00 JST +09:00, created_at: nil, updated_at: nil, user_id: 2, food_id: 84> current_user.meal_records.build(meal_record_params.merge(food_id: params[:food_id])).food Food Load (0.6ms) SELECT `foods`.* FROM `foods` WHERE `foods`.`id` = 84 LIMIT 1 ↳ (pry):27:in `create' => #<Food:0x00007f7fd0de8800 id: 84, name: "アイスクリーム", labels: ["Food", "Ice cream", "Frozen dessert", "Dish", "Dondurma", "Cuisine", "Vanilla ice cream", "Ingredient", "Sorbet", "Gelato", "Dessert", "Frozen yogurt", "Cream", "Vanilla", "Dairy"], calorie: 0, calorie_theory: "", created_at: Fri, 30 Oct 2020 21:33:27 JST +09:00, updated_at: Fri, 30 Oct 2020 21:33:27 JST +09:00>