Closed2
ActiveRecordで条件付きdependent: delete_all
class User < ApplicationRecord
has_many :posts, dependent: :delete_all
end
↓
class User < ApplicationRecord
has_many :posts
before_destroy :delete_relations, if -> { condition }
private
def delete_relations
posts.delete_all(:delete_all)
end
end
ポイント
- dependent: :delete_allはbefore_destroyで実行される
- posts.delete_all()でパラメータを指定しないとデフォルトの:nullify 扱いになって(has_manyでdependent指定をしてない場合)、Post.user_idをnilに更新しようとする。なので:delete_allオプションを渡す
- https://github.com/rails/rails/blob/a388dfad26de017e06947d9ad441d2701c7ac709/activerecord/lib/active_record/associations/has_many_association.rb#L111
- https://github.com/rails/rails/blob/700a6b216f0d6f07fc02372b421f3192ce5ded3e/activerecord/lib/active_record/associations/collection_association.rb#L142
このスクラップは2023/06/15にクローズされました