如果父项有子记录,如何防止删除父项?

时间:2010-10-29 16:54:33

标签: ruby-on-rails model associations

我已经查看了Ruby on Rails指南,但我似乎无法弄清楚如果有父级记录,有人会删除父记录。例如。如果我的数据库有 CUSTOMERS 且每个客户可以有多个 ORDERS ,我想阻止有人在数据库中有任何订单时删除客户。如果客户没有订单,他们应该只能删除客户。

在定义模型之间的关联以强制执行此行为时是否有办法?

4 个答案:

答案 0 :(得分:99)

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

修改:自Rails 4.1起,:restrict不是有效选项,而是应使用:restrict_with_error:restrict_with_exception

例如:

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

答案 1 :(得分:47)

您可以在回调中执行此操作:

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

修改

请参阅this answer了解更好的方法。

答案 2 :(得分:0)

尝试使用filters在请求处理期间挂钩自定义代码。

答案 3 :(得分:0)

一种可能性是避免在这种情况下为用户提供删除链接。

link_to_unless !@customer.orders.empty?

另一种方法是在你的控制器中处理它:

if !@customer.orders.empty?
  flash[:notice] = "Cannot delete a customer with orders"
  render :action => :some_action
end

或者,正如乔建议的那样,before_filters在这里可以很好地工作,并且可能是一种更干的方式,特别是如果你想要更多模型而不仅仅是客户这种行为。