ryota21silvaの技術ブログ

Funna(ふんな)の技術ブログ

これまで学んだ技術の備忘録。未来の自分が救われることを信じて

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>

docs.ruby-lang.org