Rails ActiveRecord: красивые ошибки при удалении зависимых сущностей с ограничениями внешних ключей - PullRequest
3 голосов
/ 18 февраля 2010

У меня в приложении на Rails несколько таблиц с ограничениями внешних ключей. Например, каждый заказ принадлежит клиенту. В таблице orders есть столбец costumer_id .

Когда я удаляю клиента с размещенным заказом из-за ограничений базы данных, MySQL возвращает ошибку:

Mysql :: Ошибка: невозможно удалить или обновить родительская строка: ограничение внешнего ключа не удается (orders, ОГРАНИЧЕНИЕ orders_ibfk_2 иностранный ключ (customer_id) ССЫЛКИ customers (id))

И на экране появляется ужасная ошибка со всеми трассировками стека и тому подобным ActiveRecord :: StatementInvalid в DevicesController # уничтожить ...

Я хотел бы знать, есть ли элегантный способ обработки этих ошибок ограничения, давая красивое выражение «вы можете удалить этот объект, потому что он связан с X»

Как я мог это сделать?

1 Ответ

4 голосов
/ 18 февраля 2010

Реагирует на обратный вызов до уничтожения:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...