Как предотвратить удаление родителя, если у него есть дочерние записи?
Я просмотрел руководства Ruby on Rails, и я не могу понять, как предотвратить удаление человеком родительской записи, если у нее есть дети. Например. Если в моей базе данных есть КЛИЕНТЫ, и каждый клиент может иметь несколько ORDERS, я хочу, чтобы кто-то не удалял клиента, если он имеет какие-либо заказы в базе данных. Они должны иметь возможность удалять клиента, если у него нет заказов.
Есть ли способ определить связь между моделями для обеспечения соблюдения этого поведения?
Ответы
Ответ 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 могли бы хорошо работать здесь и, вероятно, были бы намного более СУХОЙ способ сделать это, особенно если вы хотите, чтобы этот тип поведения больше моделей, чем просто клиент.