【Rails】before_destroy로 모델을 삭제할 수 있는지 확인하기
모델을 삭제할 수 있는지 검사하고 싶습니다
부모 모델에 아이가 여러 명 있는 상황에서
parent.rb
class Parent < ActiveRecord::Base
has_many :children, dependent: :destroy
end
child.rbclass Child < ActiveRecord::Base
belongs_to :parent
end
여기에서 하위 모델이 0건인 경우 삭제할 수 없는 삭제 검사를 끼워 넣으려면 하위 모델before_destory에서 실시할 수 있습니다.child.rb
class Child < ActiveRecord::Base
belongs_to :parent
# 追加
before_destroy :must_not_destroy_last_one_child
private
def must_not_destroy_last_one_child
throw(:abort) if (parent.children - [self]).empty?
end
end
부모 모델마다 하위 모델의 before를 삭제하려면destory 방해
이렇게 하면 모든 부모 모델을 삭제할 때 하위 모델의 beforedestory에서 오류가 발생했습니다.
모든 부모 모델을 삭제한 경우 destroyed_by_association 설정되어 있기 때문에 이 값을 보고 되돌아갈 수 있습니다.
child.rb
class Child < ActiveRecord::Base
belongs_to :parent
before_destroy :must_not_destroy_last_one_child
private
def must_not_destroy_last_one_child
return if destroyed_by_association.present? # 追加
throw(:abort) if (parent.children - [self]).empty?
end
end
이렇게 하면 해결됩니다잡담
부모 모델 측에서는
dependent: :delete_all
로 변경해 액티브 레코드 콜이 생기지 않도록 하는 방법도 있지만, 이를 추천하지 않는다.앞으로 서브모델에 추가 호출 가능성, 손자 모델 증가 가능성 등 다양한 고려가 이뤄지면 부당한 데이터가 발생하지 않도록 고려하는 일이 늘어날 것으로 보인다.
Reference
이 문제에 관하여(【Rails】before_destroy로 모델을 삭제할 수 있는지 확인하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mishiwata1015/items/ac7c33b5f116111d8568텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)