Ruby on rails Rails ActiveRecord:删除带有外键约束的依赖实体时出现非常严重的错误

Ruby on rails Rails ActiveRecord:删除带有外键约束的依赖实体时出现非常严重的错误,ruby-on-rails,activerecord,error-handling,Ruby On Rails,Activerecord,Error Handling,我在Rails应用程序中有几个带有外键约束的表。例如,每个订单都属于一个客户。订单表上有一个客户id列 由于数据库限制,当我删除已下订单的客户时,MySQL返回错误: Mysql::错误:无法删除或更新 父行:外键约束 失败(订单,约束 orders\u ibfk\u 2外键 (customer\u id)参考customers (id)) 屏幕上会弹出丑陋的错误,还有stacktrace之类的东西 ActiveRecord::语句在DeviceController中无效#销毁 我想知道是否有一

我在Rails应用程序中有几个带有外键约束的表。例如,每个订单都属于一个客户。订单表上有一个客户id列

由于数据库限制,当我删除已下订单的客户时,MySQL返回错误:

Mysql::错误:无法删除或更新 父行:外键约束 失败(
订单
,约束
orders\u ibfk\u 2
外键 (
customer\u id
)参考
customers
id
))

屏幕上会弹出丑陋的错误,还有stacktrace之类的东西 ActiveRecord::语句在DeviceController中无效#销毁

我想知道是否有一种优雅的方法来处理这些约束错误,给出一个漂亮的例子,比如“你可以删除这个对象,因为它与X关联”


我该怎么做?

在销毁前回调中做出反应:

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

  private

  def no_referenced_orders
    return if orders.empty?

    errors.add_to_base("This customer is referenced by order(s): #{orders.map(&:number).to_sentence}")
    false # If you return anything else, the callback will not stop the destroy from happening
  end
end
class客户
在控制器中:

class CustomersController < ApplicationController
  def destroy
    @customer = Customer.find(params[:id])
    if @customer.destroy then
      redirect_to customers_url
    else
      render :action => :edit
    end
  end
end
class CustomerController:编辑
结束
结束
结束

不推荐将添加到库中。(最新工作版本v2.3.8)对于Rails 3+,使用
errors[:base]