Разница между уничтожением и удалением


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

@model.destroy и @model.delete

например:

Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all

это действительно имеет значение, если я использую один или другой?

5 158

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 на определенном Родительском объекте будут удалены дочерние объекты, которые совместно используются среди других нескольких родители.

когда вы вызываете destroy или destroy_all на

Да есть большая разница между двумя методами Используйте 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. Это означает, что обратные вызовы вызываются.

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