Як видалити об’єкт ActiveRecord?


Відповіді:


572

Це destroyі destroy_allметоди, як

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

Як альтернативи ви можете використовувати deleteі delete_allякі не застосовуватимуть :before_destroyі :after_destroyзворотні виклики або будь-які залежні параметри асоціації.

User.delete_all(condition: 'value') дозволить видалити записи без первинного ключа

Примітка : з коментаря @ hammady user.destroyне буде працювати, якщо модель користувача не має первинного ключа.

Примітка 2 : З коментаря @ pavel-chuchuva, destroy_allумови та delete_allумови були зняті в Rails 5.1 - див. Guides.rubyonrails.org/5_1_release_notes.html


4
Було б добре, якби ви могли включити у свою відповідь коментар @ hammady. Напружився, щоб дізнатися, чому я не зміг знищити свій модельний об’єкт ...
the_critic


Чому він оновлює лише дані видалених стовпців видалення в моїй базі даних? Як я можу видалити весь ряд даних?
TommyQu

1
знищити_all з умовами та delete_all з умовами було знято в Rails 5.1 - див. guides.rubyonrails.org/5_1_release_notes.html
Павло Чучува

це User.find_by(username:"bob") добре для виявлення запису, щоб знищити або видалити теж.
барлоп


48
  1. User.destroy

User.destroy(1)видалить користувач id == 1і :before_destroyі :after_destroyвідбуваються зворотні виклики. Наприклад, якщо у вас пов’язані записи

has_many :addresses, :dependent => :destroy

Після знищення користувача його адреси також будуть знищені. Якщо ви замість цього використовуєте дію видалення, зворотні виклики не відбудуться.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) або User.delete_all(<conditions>)

Примітка : Користувач - клас, а користувач - об'єкт екземпляра


3
Дякуємо за звернення до пов’язаних записів.
Сейдж Мітчелл

2
BEWARE: User.destroy_all()запускає зворотні дзвінки, тому перед тим, як що-небудь видалити, він завантажує записи. Це два заяви SQL, а не один. Крім наслідків для продуктивності, це має і наслідки одночасності. Більш безпечний виклик пропускає зворотні дзвінки; User.delete_all()видасть лише одну DELETE FROM...команду.
Ендрю Ходжкінсон

1
знищити_all з умовами застаріло в Rails 5.1 - див. guides.rubyonrails.org/5_1_release_notes.html
Павло Чучува
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.