我已经查看了Ruby on Rails指南,但我似乎无法弄清楚如果有父级记录,有人会删除父记录。例如。如果我的数据库有 CUSTOMERS 且每个客户可以有多个 ORDERS ,我想阻止有人在数据库中有任何订单时删除客户。如果客户没有订单,他们应该只能删除客户。
在定义模型之间的关联以强制执行此行为时是否有办法?
答案 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在这里可以很好地工作,并且可能是一种更干的方式,特别是如果你想要更多模型而不仅仅是客户这种行为。