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

287

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

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

  • Удалить с помощью id,

  • Удалите текущий объект, например: user.remove,

  • Можете ли вы удалить на основе предложения where?

Теги:
activerecord
rails-activerecord

3 ответа

539
Лучший ответ

Это destroy и 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 вызовы :before_destroy и :after_destroy или любые зависимые опции ассоциации.

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

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

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

  • 27
    user.destroy не будет работать, если у модели User нет первичного ключа
  • 4
    Было бы неплохо, если бы вы включили комментарий @ hammady в свой ответ. Изо всех сил пытался выяснить, почему я не мог уничтожить мой модельный объект ...
Показать ещё 3 комментария
52

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

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

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

  • 2
    delete быстрее, но обходит обратные вызовы, которые вы могли определить в модели
43
  • 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
    Спасибо за обращение к связанным записям.
  • 1
    ВНИМАНИЕ: User.destroy_all() запускает обратные вызовы, поэтому, прежде чем что-либо удалить, он загружает записи. Это два оператора SQL, а не один. Помимо влияния на производительность, это также влияет на параллелизм. Более безопасный вызов пропускает обратные вызовы; User.delete_all() выдаст всего одну команду DELETE FROM...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню