Situación a partir de Rails 6:
Esto funciona:
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
no funciona: https://github.com/rails/rails/issues/32376
Dado que throw(:abort)
se requiere Rails 5 para cancelar la ejecución: https://makandracards.com/makandra/20301-cancelling-the-activerecord-callback-chain
prepend: true
es necesario para que dependent: :destroy
no se ejecute antes de que se ejecuten las validaciones: https://github.com/rails/rails/issues/3458
Pueden pescar esto juntos a partir de otras respuestas y comentarios, pero no encontré ninguno de ellos completo.
Como nota al margen, muchos usaron una has_many
relación como ejemplo en el que quieren asegurarse de no eliminar ningún registro si crearía registros huérfanos. Esto se puede resolver mucho más fácilmente:
has_many :entities, dependent: :restrict_with_error