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

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

@model.destroy и @model.delete

Например:

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

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

5 Solutions collect form web for “Разница между Destroy и Delete”

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

Из Rails API :

  • ActiveRecord::Persistence.delete

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

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

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

  • ActiveRecord::Persistence.destroy

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Rails: получить IP-адрес клиента
  • Добавить виртуальный атрибут для вывода json
  • Чистый способ найти объекты ActiveRecord по идентификатору в указанном порядке
  • Rails 4 путь изображения, URL-адрес изображения и URL-адрес ресурса больше не работают в файлах SCSS
  • form_for с вложенными ресурсами
  • undefined метод `get 'для #
  • В Ruby on Rails, какая разница между DateTime, Timestamp, Time и Date?
  • Rspec и названные маршруты
  • Rails 2.3-стиль плагинов и предупреждения о предупреждениях, выполняемые в Heroku
  • OmniAuth & Facebook: проверка сертификата не выполнена
  • Как использовать длинный идентификатор в Rails-приложениях?
  • Давайте будем гением компьютера.