地方でリモートワーク

プログラミング、先物、fx,仮想通貨なんでもやります

has_and_belongs_to_manyのdependent destroyの挙動について

スポンサーリンク

f:id:ihatov08:20160809101914j:plain

railsのアソシエーションで中間テーブルは持つが、中間モデルはもたないhas_and_belongs_to_many関連付けがあります。

この関連付けでdependent: :destroyオプションをつけた際は、中間テーブルのレコードが削除される挙動でした。

関連付け名は中間テーブルではないのであまり直感的ではないですが、上記挙動をとるようです。

class ChefFood < ApplicationRecord
  has_and_belongs_to_many :tags, dependent: :destroy
class Tag < ApplicationRecord
  has_and_belongs_to_many :chef_foods
end

tagは削除されない↓

[13] pry(main)> ChefFood.first.destroy
  ChefFood Load (0.4ms)  SELECT  `chef_foods`.* FROM `chef_foods` ORDER BY `chef_foods`.`id` ASC LIMIT 1
   (0.3ms)  BEGIN
  ChefFoodImage Load (0.5ms)  SELECT `chef_food_images`.* FROM `chef_food_images` WHERE `chef_food_images`.`chef_food_id` = 2
  SQL (0.9ms)  DELETE FROM `chef_food_images` WHERE `chef_food_images`.`id` = 3
  SQL (0.7ms)  DELETE FROM `chef_food_images` WHERE `chef_food_images`.`id` = 4
  ChefFoodAvailableDay Load (0.6ms)  SELECT `chef_food_available_days`.* FROM `chef_food_available_days` WHERE `chef_food_available_days`.`chef_food_id` = 2
  SQL (0.6ms)  DELETE FROM `chef_food_available_days` WHERE `chef_food_available_days`.`id` = 3
  SQL (0.5ms)  DELETE FROM `chef_food_available_days` WHERE `chef_food_available_days`.`id` = 4
  SQL (0.6ms)  DELETE FROM `chef_foods_tags` WHERE `chef_foods_tags`.`chef_food_id` = 2
  SQL (0.5ms)  DELETE FROM `chef_foods` WHERE `chef_foods`.`id` = 2