В чем разница между
@model.destroy
и @model.delete
Например:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Действительно ли имеет значение, использую ли я одно или другое?
источник
В чем разница между
@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, действие отменяется, а destroy возвращает false. См. ActiveRecord :: Callbacks для получения дополнительной информации.
model#before_destroy
что может использоваться для остановки окончательногоdestroy()
вызова при определенных условиях.delete
удалит только текущую запись объекта из БД, но не связанные с ней дочерние записи из БД.destroy
удалит текущую запись объекта из базы данных, а также связанную с ней дочернюю запись из базы данных.Их использование действительно имеет значение:
Если ваши родительские объекты имеют общие дочерние объекты, то вызов
destroy
определенного родительского объекта приведет к удалению дочерних объектов, которые совместно используются другими несколькими родителями.источник
destroy
это потомки , а не дети : согласно документации, destroy «создает новый объект из атрибутов, а затем вызывает для него уничтожение». rubydoc.info/docs/rails/4.1.7/ActiveRecord%2FRelation:destroyКогда вы вызываете
destroy
илиdestroy_all
наActiveRecord
объекте,ActiveRecord
инициируется процесс «уничтожения», он анализирует класс, который вы удаляете, определяет, что он должен делать для зависимостей, проходит проверки и т. Д.Когда вы вызываете объект
delete
или обращаетесьdelete_all
к нему, онActiveRecord
просто пытается выполнитьDELETE FROM tablename WHERE conditions
запрос к базе данных, не выполняя никаких другихActiveRecord
задач.источник
Да, между этими двумя методами есть существенное различие. Используйте delete_all, если хотите, чтобы записи быстро удалялись без вызова обратных вызовов модели.
Если вам небезразличны обратные вызовы ваших моделей, тогда используйте destroy_all
Из официальных документов
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
источник
В основном «удалить» отправляет запрос непосредственно в базу данных, чтобы удалить запись. В этом случае Rails не знает, какие атрибуты находятся в записи, которую он удаляет, и нет ли каких-либо обратных вызовов (таких как
before_destroy
).Метод "destroy" берет переданный идентификатор, выбирает модель из базы данных, используя метод "find", а затем вызывает destroy для этого. Это означает, что обратные вызовы запускаются.
Вы можете использовать «удалить», если не хотите, чтобы выполнялись обратные вызовы или вы хотите повысить производительность. В противном случае (и большую часть времени) вы захотите использовать «уничтожить».
источник
Уже много ответов; хотел прыгнуть с немного больше.
документы :
delete
Verbage работает по- разному дляActiveRecord::Association.has_many
иActiveRecord::Base
. В последнем случае delete выполнитSQL DELETE
и пропустит все проверки / обратные вызовы. Первый будет выполнен на основе:dependent
опции, переданной в ассоциацию. Однако, во время тестирования, я нашел следующий побочный эффект , когда обратные вызовы пробежались толькоdelete
и неdelete_all
dependent: :destroy
Пример:источник