Стан справ за напрямком 6:
Це працює:
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: :destroy
не працює: https://github.com/rails/rails/issues/32376
Оскільки Rails 5 throw(:abort)
потрібно скасувати виконання: https://makandracards.com/makandra/20301-cancelling-the-activerecord-callback-chain
prepend: true
необхідний, щоб dependent: :destroy
не запускатись перед виконанням перевірок: https://github.com/rails/rails/issues/3458
Ви можете рибалити це разом з інших відповідей та коментарів, але я виявив, що жоден з них не є повним.
Як сиденот, багато хто використовував has_many
відношення як приклад, коли вони хочуть переконатись, що не видаляють жодні записи, якщо це створить осиротілі записи. Це можна вирішити набагато простіше:
has_many :entities, dependent: :restrict_with_error