Подтвердить что ты не робот

Как предотвратить удаление родителя, если у него есть дочерние записи?

Я просмотрел руководства Ruby on Rails, и я не могу понять, как предотвратить удаление человеком родительской записи, если у нее есть дети. Например. Если в моей базе данных есть КЛИЕНТЫ, и каждый клиент может иметь несколько ORDERS, я хочу, чтобы кто-то не удалял клиента, если он имеет какие-либо заказы в базе данных. Они должны иметь возможность удалять клиента, если у него нет заказов.

Есть ли способ определить связь между моделями для обеспечения соблюдения этого поведения?

4b9b3361

Ответ 1

Вы можете сделать это в обратном вызове:

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

ИЗМЕНИТЬ

см. этот ответ для лучшего способа сделать это.

Ответ 2

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

Ответ 3

Попробуйте использовать фильтры, чтобы подключить пользовательский код во время обработки запроса.

Ответ 4

Одной из возможностей было бы избежать предоставления пользователям ссылки на удаление в этом сценарии.

link_to_unless [email protected]?

Другим способом было бы управлять этим в вашем контроллере:

if [email protected]?
  flash[:notice] = "Cannot delete a customer with orders"
  render :action => :some_action
end

Или, как предлагает Джо, before_filters могли бы хорошо работать здесь и, вероятно, были бы намного более СУХОЙ способ сделать это, особенно если вы хотите, чтобы этот тип поведения больше моделей, чем просто клиент.