web-dev-qa-db-fra.com

Comment détruire plusieurs objets simultanément dans Rails 3

J'ai une application Rails qui essaie de supprimer plusieurs objets à la fois.

J'ai essayé comme envoyer un ensemble d'identifiant séparé par ',' à la méthode de destruction de Rails, mais il ne détruit qu'un seul objet . Est-il possible de supprimer plusieurs objets dans Rails 3.

43
Cyber

destroy_all détruit les conditions de correspondance des enregistrements en appelant destroy method pour chaque enregistrement instancié Les rappels d’objets sont donc exécutés. 

Model.destroy_all(:status => "inactive")
Model.where(:id => [1,2,3,4,5]).destroy_all
Model.where(:id => 1..5).destroy_all

METTRE À JOUR

User.where(:id => params[:ids]).destroy_all

/users?ids[]=1&ids[]=2&ids[]=3
90
Eugene Rourke
Model.delete([1,2,5,6]) 

ou 

Model.delete_all(["col_name in (?)", [1,2,5,6]])

Il suffit de passer le tableau ids

6
Sachin R

Vous pouvez également supprimer une plage d'identifiants. Supposons que vous avez 1 500 enregistrements et que vous souhaitez supprimer de 751 au dernier:

a = Model.where(id: [751..1500])
a.destroy_all
0
LordKiz

Si les performances sont importantes pour vous et/ou si vous travaillez sur un ensemble de données volumineux, vous devriez préférer delete_all à destroy_all.

Destroy_all exécutera une requête DELETE une à la fois. Donc ça peut être très lent. Plus de détails sur les différences entre delete_all et destroy_all peuvent être trouvés sur cette page .

Puisque la réponse de @M Kumar sera obsolète avec la version du nouveau rail.

Model.delete_all(["col_name in (?)", [1,2,5,6]])
DEPRECATION WARNING: Passing conditions to delete_all is deprecated and will be removed in Rails 5.1.

Cette commande pourrait aider d'autres dans le futur:

Model.where(id: [1,2,5,6]).delete_all
0
devoh

J'ai eu exactement le même problème, mais la solution ici ne fonctionnait pas pour moi dans Rails 5.1.6.

Peut-être que vous passez le paramètre params[:ids] de manière incorrecte.

Voici comment je le répare.

Avant

Model.where(:id => params[:ids]).destroy_all

Après

ids = params[:ids].split(",")
Model.where(:id => ids).destroy_all
0
蔡依玲