Разница между Destroy и Delete

в чем разница между

@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

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

    существует ряд обратных вызовов, связанных с destroy. Если before_destroy обратный вызов возвращает false действие отменяется и destroy возвращает false. Дополнительные сведения см. В разделе ActiveRecord::Callbacks.


delete удалит только текущую запись объекта из БД, но не связанные с ней дочерние записи из БД.

destroy удалит текущую запись объекта из БД, а также связанную с ней дочернюю запись из БД.

их использование действительно имеет значение:

Если ваши несколько родительских объектов совместно используют общие дочерние объекты, то вызов destroy на конкретном Родительском объекте будут удалены дочерние объекты, которые совместно используются среди других нескольких родители.


при вызове destroy или destroy_all на


Да существует большая разница между двумя методами Используйте delete_all, если вы хотите, чтобы записи были быстро удалены без обратного вызова модели

Если вы заботитесь о своих моделях обратных вызовов, то используйте destroy_all

из официальных документов

http://apidock.com/rails/ActiveRecord/Base/destroy_all/class

destroy_all (условия = nil) public

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

Примечание: создание экземпляра, выполнение обратного вызова и удаление каждой записи может занять много времени, когда вы удаляете много записей сразу. Он создает по крайней мере один запрос SQL DELETE на запись (или, возможно, более, чтобы обеспечить ваши обратные вызовы). Если вы хотите быстро удалить много строк, не заботясь об их связях или обратных вызовах, используйте delete_all вместо.


в основном "удалить" отправляет запрос непосредственно в базу данных для удаления записи. В этом случае Rails не знает, какие атрибуты находятся в записи, которую он удаляет, и нет ли обратных вызовов (например,before_destroy).

метод " destroy "принимает переданный идентификатор, извлекает модель из базы данных с помощью метода" find", а затем вызывает destroy. Это означает, что обратные вызовы вызываются.

вы хотели бы использовать "удалить", если вы не хотите, чтобы обратные вызовы были срабатывает или вы хотите лучшую производительность. В противном случае (и большую часть времени) вы захотите использовать "уничтожить".