Разница между уничтожением и удалением
в чем разница между
@model.destroy и @model.delete
например:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
это действительно имеет значение, если я использую один или другой?
5 ответов:
в принципе
destroyзапускает любые обратные вызовы на модели в то время какdeleteнет.С Rails API:
ActiveRecord::Persistence.deleteудаляет запись в базе данных и замораживает этот экземпляр, чтобы отразить, что никакие изменения не должны быть сделаны (так как они не могут быть сохранены). Возвращает замороженный экземпляр.
строка просто удаляется с помощью инструкции SQL DELETE на основной записи ключ, и никакие обратные вызовы не выполняются.
чтобы применить обратные вызовы объекта before_destroy и after_destroy или любые: зависимые параметры ассоциации, используйте #destroy.
ActiveRecord::Persistence.destroyудаляет запись в базе данных и замораживает этот экземпляр, чтобы отразить, что никакие изменения не должны быть сделаны (так как они не могут быть сохранены).
есть ряд обратных вызовов, связанных с уничтожить. Если before_destroy обратного вызова возвращает false, то действие отменяется и уничтожить возвращает false. Дополнительные сведения см. В разделе ActiveRecord::обратные вызовы.
deleteудаляет только текущую запись объекта из БД, но не связанные с ней дочерние записи из БД.
destroyудалит текущую запись объекта из БД, а также связанную с ней дочернюю запись из БД.их использование действительно имеет значение:
Если несколько родительских объектов имеют общие объекты, то вызов
destroyна определенном Родительском объекте будут удалены дочерние объекты, которые совместно используются среди других нескольких родители.
Да есть большая разница между двумя методами Используйте delete_all, если вы хотите, чтобы записи удалялись быстро без вызова обратных вызовов модели
Если вы заботитесь о своих моделях обратных вызовов, то используйте destroy_all
из официальных документов
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
destroy_all (conditions = nil) public
уничтожает соответствующие записи условия создания каждой записи и вызывая его уничтожить метод. Обратные вызовы каждого объекта выполняются (в том числе: зависимые варианты ассоциации и методы наблюдателя before_destroy/after_destroy). Возвращает коллекцию объектов, которые были уничтожены; каждый будет заморожен, чтобы отразить это никакие изменения не должны быть сделаны (так как они не могут быть сохранены).
Примечание: создание экземпляра, выполнение обратного вызова и удаление каждой записи может занять много времени, когда вы удаляете много записей сразу. Оно создает по крайней мере один запрос на удаление SQL для каждой записи (или, возможно, больше, чтобы обеспечить ваши обратные вызовы). Если вы хотите удалить много строк быстро, не заботясь об их связях или обратных вызовах, используйте delete_all вместо.
в основном "удалить" отправляет запрос непосредственно в базу данных для удаления записи. В этом случае Rails не знает, какие атрибуты находятся в записи, которую он удаляет, и если есть какие-либо обратные вызовы (например,
before_destroy).метод " destroy "принимает переданный идентификатор, извлекает модель из базы данных с помощью метода" find", а затем вызывает метод destroy. Это означает, что обратные вызовы вызываются.
вы хотели бы использовать "удалить", если вы не хотите, чтобы обратные вызовы были срабатывает или вы хотите повысить производительность. В противном случае (и большую часть времени) вы захотите использовать "уничтожить".