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

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

@model.destroy и @model.delete

Например:

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

Действительно ли это важно, если я использую тот или иной?

Ответ 1

В основном destroy выполняет любые обратные вызовы модели, а delete - нет.

Из Rails API:

  • ActiveRecord::Persistance.delete

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

    Строка просто удаляется с помощью оператора SQL DELETE в первичном ключе записи и никаких обратных вызовов не выполняются.

    Чтобы обеспечить выполнение объектов before_destroy и after_destroy обратных вызовов или любых зависимых параметров ассоциации, используйте #destroy.

  • ActiveRecord::Persistance.destroy

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

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

Ответ 2

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

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

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

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

Ответ 3

Когда вы вызываете destroy или destroy_all объекта ActiveRecord, процесс ActiveRecord "destroy" инициируется, он анализирует класс, который вы удаляете, он определяет, что он должен делать для зависимостей, работает через проверки и т.д.

Когда вы вызываете delete или delete_all для объекта, ActiveRecord просто пытается запустить запрос DELETE FROM tablename WHERE conditions к db, не выполняя никаких других ActiveRecord -уровневых задач.

Ответ 4

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

Ответ 5

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

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

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