module ActiveRecord
class DestroyRestrictedAssociationError < ActiveRecordError
def initialize(model, by)
super("#{model.class.name} #{model.id} destroy restricted by #{by}")
end
end
module Associations
def self.included(base) # :nodoc:
base.extend ClassMethods
end
module ClassMethods
alias :old_configure_dependency_for_has_many :configure_dependency_for_has_many
alias :old_configure_dependency_for_has_one :configure_dependency_for_has_one
def verify_restrict(reflection)
case reflection.options[:dependent]
when :restrict
module_eval %Q{
before_destroy do |record|
unless record.#{reflection.name}.blank?
raise DestroyRestrictedAssociationError.new(record, #{reflection.name.inspect})
end
end
}
else
raise ArgumentError, "The :dependent option expects either
:destroy, :delete_all, :nullify or :restrict
(#{reflection.options[:dependent].inspect})"
end
end
def configure_dependency_for_has_many(reflection)
old_configure_dependency_for_has_many(reflection)
rescue ArgumentError
verify_restrict(reflection)
end
def configure_dependency_for_has_one(reflection)
old_configure_dependency_for_has_one(reflection)
rescue ArgumentError
verify_restrict(reflection)
end
end
end
end