Thanks guys. This works great. Just to clarify, if the callback returns false, the object will not be destroyed.
Code:
class Vendor < ActiveRecord::Base
# relationships
has_many :software
before_destroy :dont_destroy_if_children
def dont_destroy_if_children()
software.empty? ? true : false
end
end
The following test passes
Code:
def setup()
@vendor = Vendor.find(1)
end
def test_delete()
# If vendor has childen, do not delete
assert_equal(false, @vendor.destroy)
assert_equal(1, @vendor.software.size)
assert_nothing_raised(ActiveRecord::RecordNotFound) { Vendor.find(@vendor.id) }
# You can delete the vendor, after you have deleted its children
@vendor.software.clear
assert(@vendor.destroy)
assert_raise(ActiveRecord::RecordNotFound) { Vendor.find(@vendor.id) }
end
Code:
rooster > ruby test/unit/vendor_test.rb
Loaded suite test/unit/vendor_test
Started
....
Finished in 0.147694 seconds.
4 tests, 17 assertions, 0 failures, 0 errors
Bookmarks