Stan na Rails 6:
To działa:
before_destroy :ensure_something, prepend: true do
throw(:abort) if errors.present?
end
private
def ensure_something
errors.add(:field, "This isn't a good idea..") if something_bad
end
validate :validate_test, on: :destroynie działa: https://github.com/rails/rails/issues/32376
Ponieważ Rails 5 throw(:abort)jest zobowiązany do anulowania wykonania: https://makandracards.com/makandra/20301-cancelling-the-activerecord-callback-chain
prepend: truejest wymagany, aby dependent: :destroynie działał przed wykonaniem walidacji: https://github.com/rails/rails/issues/3458
Możesz wyłowić to razem z innymi odpowiedziami i komentarzami, ale żadna z nich nie jest kompletna.
Na marginesie, wielu użyło has_manyrelacji jako przykładu, w którym chcą upewnić się, że nie usuwają żadnych rekordów, jeśli spowodowałoby to utworzenie osieroconych rekordów. Można to rozwiązać znacznie łatwiej:
has_many :entities, dependent: :restrict_with_error