Rob
Rob

Reputation: 780

How do I prevent deletion of parent if it has child records?

I have looked through the Ruby on Rails guides and I can't seem to figure out how to prevent someone from deleting a Parent record if it has Children. For example. If my database has CUSTOMERS and each customer can have multiple ORDERS, I want to prevent someone from deleting a customer if it has any orders in the database. They should only be able to delete a customer if it has no orders.

Is there a way when defining the association between models to enforce this behavior?

Upvotes: 50

Views: 20785

Answers (4)

Mauro
Mauro

Reputation: 1235

class Customer < ActiveRecord::Base
  has_many :orders, :dependent => :restrict # raises ActiveRecord::DeleteRestrictionError

Edit: as of Rails 4.1, :restrict is not a valid option, and instead you should use either :restrict_with_error or :restrict_with_exception

Eg.:

class Customer < ActiveRecord::Base
  has_many :orders, :dependent => :restrict_with_error

Upvotes: 118

zetetic
zetetic

Reputation: 47548

You could do this in a callback:

class Customer < ActiveRecord::Base
  has_many :orders
  before_destroy :check_for_orders

  private

  def check_for_orders
    if orders.count > 0
      errors.add_to_base("cannot delete customer while orders exist")
      return false
    end
  end
end

EDIT

see this answer for a better way to do this.

Upvotes: 53

Samo
Samo

Reputation: 8240

One possibility would be to avoid providing your users a link to deletion in this scenario.

link_to_unless [email protected]?

Another way would be to handle this in your controller:

if [email protected]?
  flash[:notice] = "Cannot delete a customer with orders"
  render :action => :some_action
end

Or, as Joe suggests, before_filters could work well here and would probably be a much more DRY way of doing this, especially if you want this type of behavior for more models than just Customer.

Upvotes: 0

Joseph Weissman
Joseph Weissman

Reputation: 5717

Try using filters to hook in custom code during request processing.

Upvotes: 0

Related Questions