2015-07-14 3 views
1

В Rails документа Active Record Associations, первые 2 значения :dependent для has_one являются:разница между: уничтожить и: удалить для: зависимый в HAS_ONE ассоциации

4.2.2.4 :dependent 

Controls what happens to the associated object when its owner is destroyed: 

    :destroy causes the associated object to also be destroyed 
    :delete causes the associated object to be deleted directly from the database (so callbacks will not execute) 

Мое понимание о :destroy является например, customerhas_oneaddress , С :dependent => :destroy, если customer удален, то address будет автоматически удалён из базы данных после того, как customer будет удален из базы данных, и мы обычно используем :destroy. Что такое использование :delete?

+0

Ну есть тонкая разница между опцией для объединения и удаления действия объекта модели. – user938363

ответ

3

И делает почти то же самое, я сказал почти, потому что:

зависит:: уничтожить - вызывает обратные вызовы (before_destroy, after_destroy) в связанных с ними объектов, а затем вы в состоянии разорвать сделки (поднять ошибку в Перезвони).

зависит:: удаление - не вызывает функцию обратного вызова (она удаляет объект непосредственно из базы данных с помощью SQL LIKE DELETE FROM ... WHERE ...)

3

Для того, чтобы завершить ответ Джен уничтожить добавляет загрузку объекта в память перед удалением (и вызовом обратных вызовов). В принципе, существует определенная разница, поскольку использование delete исключает обратные вызовы/проверки, и это может привести к сбою ссылочной целостности.

удаление

Удаляет строку с первичным ключом, соответствующим идентификатор аргумент, используя SQL DELETE заявления и возвращает количество удаленных строк. Объекты Active Record не создаются, поэтому обратные вызовы объекта не выполняются, в том числе любые зависимые параметры ассоциации.

Вы можете удалить сразу несколько строк, передав массив идентификаторов.

Примечание. Хотя это часто намного быстрее, чем альтернатива, #destroy, пропуская обратные вызовы могут обойти бизнес-логику в вашем приложении, которая обеспечивает ссылочную целостность или выполняет другие важные задания.

уничтожить

уничтожить объект (или несколько объектов), который имеет заданный идентификатор. Сначала создается экземпляр объекта, поэтому все обратные вызовы и фильтры запускаются перед удалением объекта. Этот метод менее эффективен, чем ActiveRecord # delete, но позволяет выполнять методы очистки и другие действия.

Это по существу находит объект (или несколько объектов) с данным идентификатором, создает новый объект из атрибутов и затем вызывает его уничтожение.

http://apidock.com/rails/ActiveRecord/Relation/destroy

Для дальнейшего обсуждения взглянуть на этот пост Difference between Destroy and Delete

Смежные вопросы