🗑️

論理削除した親から子を参照する【Paranoia】

2022/09/07に公開

概要

Paranoiaで親を論理削除し、削除した親から子を参照したかったが、ネットを調べても出てこなかったので備忘録

https://github.com/rubysherpas/paranoia

結論

子供側にwithout_default_scope: trueを付ける

class Parent < ApplicationRecord
	acts_as_paranoid
	has_one :child, dependent: :destroy
end
class Child < ApplicationRecord
+	acts_as_paranoid without_default_scope: true
	belongs_to :parent
end

without_default_scope: trueを付けることでデフォルトで発行されるdeleted_at IS NULLがなくなるので、削除した子を参照してもNULLになることは無くなる

検証

$ rails c
irb(main):007:0> Parent.find(1).destroy!
irb(main):002:0> Parent.only_deleted.find(1).child
  Parent Load (0.5ms)  SELECT `parent`.* FROM `parent` WHERE `parent`.`deleted_at` IS NOT NULL AND `parent`.`id` = 1 LIMIT 1
  Child Load (1.0ms)  SELECT `child`.* FROM `child` WHERE `child`.`parent_id` = 1 LIMIT 1

Discussion