Как удалить объект ActiveRecord?

328

Как удалить объект ActiveRecord?

Я посмотрел на Active Record Querying, и у меня нет ничего при удалении, что я вижу.

  1. Удалить id,

  2. Удалить текущий объект как: user.remove,

  3. Вы можете удалить, основываясь на whereпредложении?

Бланкмэн
источник

Ответы:

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будет работать, если у модели User нет первичного ключа.

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

Марек Сапота
источник
4
Было бы неплохо, если бы вы включили комментарий @ hammady в свой ответ.
Изо всех сил пытался
Почему он только обновляет данные столбца удаленных_ в моей базе данных? Как я могу удалить всю строку данных?
TommyQu
1
destroy_all с условиями и delete_all с условиями устарели в Rails 5.1 - см. guides.rubyonrails.org/5_1_release_notes.html
Павел Чучува
Это также User.find_by(username:"bob") полезно для идентификации записи, которую нужно уничтожить или удалить.
Бароп
60

Существует delete, delete_all, destroyи destroy_all.

Документы: старые документы и документы Rails 3.0.0

deleteне создает объекты, а destroyделает. В общем, deleteбыстрее чем destroy.

nonopolarity
источник
4
deleteбыстрее, но обходит обратные вызовы, которые вы могли определить на модели
Руди
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
ВНИМАНИЕ: User.destroy_all()запускает обратные вызовы, поэтому, прежде чем что-либо удалить, загружает записи. Это два оператора SQL, а не один. Помимо влияния на производительность, это также влияет на параллелизм. Более безопасный вызов пропускает обратные вызовы; User.delete_all()выдаст только одну DELETE FROM...команду.
Эндрю Ходжкинсон
1
destroy_all с условиями устарел в Rails 5.1 - см. guides.rubyonrails.org/5_1_release_notes.html
Павел Чучува