Разница между уничтожением и удалением
в чем разница между
@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. Это означает, что обратные вызовы вызываются.
вы хотели бы использовать "удалить", если вы не хотите, чтобы обратные вызовы были срабатывает или вы хотите повысить производительность. В противном случае (и большую часть времени) вы захотите использовать "уничтожить".