Comment supprimer un objet ActiveRecord?

328

Comment supprimer un objet ActiveRecord?

J'ai regardé Active Record Querying et il n'y a rien sur la suppression que je puisse voir.

  1. Supprimer par id,

  2. Supprimer l'objet courant comme: user.remove,

  3. Pouvez-vous supprimer en fonction d'une whereclause?

Blankman
la source

Réponses:

572

C'est destroyet les destroy_allméthodes, comme

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

Alternativement, vous pouvez utiliser deleteet delete_allqui n'appliquera pas :before_destroyet les :after_destroyrappels ou toute option d'association dépendante.

User.delete_all(condition: 'value') vous permettra de supprimer des enregistrements sans clé primaire

Remarque : d'après le commentaire de @ hammady, user.destroyne fonctionnera pas si le modèle utilisateur n'a pas de clé primaire.

Note 2 : D'après le commentaire de @ pavel-chuchuva, les destroy_allconditions et les delete_allconditions ont été dépréciées dans Rails 5.1 - voir guides.rubyonrails.org/5_1_release_notes.html

Marek Sapota
la source
4
Ce serait bien si vous pouviez inclure le commentaire de @ hammady dans votre réponse. J'ai eu du mal à découvrir pourquoi je ne pouvais pas détruire mon objet modèle ...
the_critic
Pourquoi ne met-il à jour que les données de la colonne delete_at dans ma base de données? Comment supprimer toute la ligne de données?
TommyQu
1
destroy_all avec conditions et delete_all avec conditions a été déprécié dans Rails 5.1 - voir guides.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
il User.find_by(username:"bob") est également utile d'identifier l'enregistrement à détruire ou à supprimer.
barlop
60

Il y a delete, delete_all, destroyet destroy_all.

Les documents sont: des documents plus anciens et des documents Rails 3.0.0

deleten'instancie pas les objets, alors qu'il le destroyfait. En général, deleteest plus rapide que destroy.

non-polarité
la source
4
deleteest plus rapide mais contourne les rappels que vous auriez pu définir sur le modèle
Rudi
48
  1. User.destroy

User.destroy(1)supprimera l'utilisateur avec id == 1et :before_destroyet les :after_destroyrappels se produiront. Par exemple, si vous avez des enregistrements associés

has_many :addresses, :dependent => :destroy

Une fois l'utilisateur détruit, ses adresses seront également détruites. Si vous utilisez plutôt l'action de suppression, aucun rappel ne se produira.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) ou User.delete_all(<conditions>)

Remarque : l'utilisateur est une classe et l'utilisateur est un objet d'instance

Tadas T
la source
3
Merci d'avoir adressé les enregistrements associés.
Sage Mitchell
2
ATTENTION: User.destroy_all()exécute les rappels, donc avant de supprimer quoi que ce soit, il charge les enregistrements. Ce sont deux instructions SQL et non une seule. Outre les implications en termes de performances, cela a également des implications sur la concurrence. L'appel le plus sûr ignore les rappels; User.delete_all()émettra une seule DELETE FROM...commande.
Andrew Hodgkinson
1
destroy_all avec conditions a été déprécié dans Rails 5.1 - voir guides.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva