【问题标题】:Rails ActiveRecord: pretty errors when deleting dependent entities with foreign keys constraintsRails ActiveRecord:删除具有外键约束的依赖实体时出现严重错误
【发布时间】:2025-11-28 16:10:01
【问题描述】:

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

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

Mysql::Error: 无法删除或更新 父行:外键约束 失败(orders,约束 orders_ibfk_2外键 (customer_id) 参考资料customers (id))

屏幕上会弹出丑陋的错误,包括所有堆栈跟踪和那些东西 设备控制器中的 ActiveRecord::StatementInvalid#destroy ...

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

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails activerecord error-handling


    【解决方案1】:

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

    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 CustomersController < ApplicationController
      def destroy
        @customer = Customer.find(params[:id])
        if @customer.destroy then
          redirect_to customers_url
        else
          render :action => :edit
        end
      end
    end
    

    【讨论】:

    • add_to_base 已弃用。 (最新工作版本 v2.3.8)对于 Rails 3+,使用 errors[:base] &lt;&lt; "err_msg"errors.add(:base, "err_msg")
    最近更新 更多