Як видалити об’єкт ActiveRecord?
Я переглянув запит активного запису, і він не має нічого про видалення, що я бачу.
Видалити
id
,Видалити поточний об'єкт як:
user.remove
,Чи можна видалити на основі
where
пункту?
Як видалити об’єкт ActiveRecord?
Я переглянув запит активного запису, і він не має нічого про видалення, що я бачу.
Видалити id
,
Видалити поточний об'єкт як: user.remove
,
Чи можна видалити на основі where
пункту?
Відповіді:
Це 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
User.find_by(username:"bob")
добре для виявлення запису, щоб знищити або видалити теж.
Існує delete
, delete_all
, destroy
і destroy_all
.
Документи: старші документи та документи Rails 3.0.0
delete
не створює екземпляри об'єктів, а destroy
робить. Загалом, delete
швидше, ніж destroy
.
delete
швидше, але обходить зворотні дзвінки, які ви могли визначити на моделі
User.destroy
User.destroy(1)
видалить користувач id == 1
і :before_destroy
і :after_destroy
відбуваються зворотні виклики. Наприклад, якщо у вас пов’язані записи
has_many :addresses, :dependent => :destroy
Після знищення користувача його адреси також будуть знищені. Якщо ви замість цього використовуєте дію видалення, зворотні виклики не відбудуться.
User.destroy
, User.delete
User.destroy_all(<conditions>)
або User.delete_all(<conditions>)
Примітка : Користувач - клас, а користувач - об'єкт екземпляра
User.destroy_all()
запускає зворотні дзвінки, тому перед тим, як що-небудь видалити, він завантажує записи. Це два заяви SQL, а не один. Крім наслідків для продуктивності, це має і наслідки одночасності. Більш безпечний виклик пропускає зворотні дзвінки; User.delete_all()
видасть лише одну DELETE FROM...
команду.