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?

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


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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.