【Rails】before_destroy로 모델을 삭제할 수 있는지 확인하기

3844 단어 RubyRails

모델을 삭제할 수 있는지 검사하고 싶습니다


부모 모델에 아이가 여러 명 있는 상황에서
parent.rb
class Parent < ActiveRecord::Base
  has_many :children, dependent: :destroy
end
child.rb
class 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로 변경해 액티브 레코드 콜이 생기지 않도록 하는 방법도 있지만, 이를 추천하지 않는다.
앞으로 서브모델에 추가 호출 가능성, 손자 모델 증가 가능성 등 다양한 고려가 이뤄지면 부당한 데이터가 발생하지 않도록 고려하는 일이 늘어날 것으로 보인다.

좋은 웹페이지 즐겨찾기