如果有子logging,如何防止删除父母?

我已经浏览了Ruby on Rails指南,我似乎无法弄清楚如何防止某人删除父logging(如果有子项)。 例如。 如果我的数据库有CUSTOMERS ,每个客户可以有多个ORDERS ,我想阻止有人删除一个客户,如果它有数据库中的任何订单。 他们应该只能删除一个客户,如果没有订单。

定义模型之间的关联以执行此行为时有没有办法?

你可以在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 

编辑

看到这个答案更好的方式来做到这一点。

 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 

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

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

 link_to_unless !@customer.orders.empty? 

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

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

或者,正如Joe所build议的那样,before_filters在这里可以很好地工作,而且可能会更加干干净净,尤其是如果你想要这种types的行为,而不仅仅是Customer,