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

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

@model.destroy и @model.delete

Например:

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

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

В основном 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».

  • Как установить контроль доступа-allow-origin в webrick под рельсами?
  • Rails - использовать тип столбца без STI?
  • Как вы пишете нечувствительный к регистру запрос для MySQL и Postgres?
  • Как использовать длинный идентификатор в Rails-приложениях?
  • Ruby on Rails - импорт данных из файла CSV
  • Как можно импортировать только переменные и миксины из таблиц стилей Scss?
  • Ruby on Rails 3, несовместимые кодировки символов: UTF-8 и ASCII-8BIT с i18n
  • Несколько пользовательских моделей с Ruby On Rails и разработайте отдельные маршруты регистрации, но один общий логин
  • Как переопределить соглашения об именах rails?
  • Устанавливать ограничение на один сеанс на пользователя за раз
  • Как отменить конкретную миграцию?
  • Interesting Posts

    Режим браузера IE8 в режиме документа

    «Операция недействительна из-за ошибки текущего состояния объекта во время обратной передачи

    Проблемы с совместимостью javafx 8 – статические поля FXML

    Слушатель модели JTable слишком быстро обнаруживает вставленные строки (до их рисования)

    Динамические маршруты из базы данных для ASP.NET MVC CMS

    CSS: установить фоновое изображение с непрозрачностью?

    Выберите «Макс» () с помощью «group by» в mongodb

    Как сохранить работу службы в фоновом режиме даже после выхода из приложения?

    Загрузка внешнего файла csv в jsfiddle

    Сгенерировать все уникальные подстроки для заданной строки

    Инъекция зависимостей против заводского шаблона

    Как сделать ярлык для ftp-сайта открытым в Windows Explorer не IE

    Могут ли мои enums иметь дружеские имена?

    Как сохранить строку в текстовый файл с помощью Java?

    Chrome не выполнит двухфакторную аутентификацию

    Давайте будем гением компьютера.