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.
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
Model.delete([1,2,5,6])
ou
Model.delete_all(["col_name in (?)", [1,2,5,6]])
Il suffit de passer le tableau ids
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
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
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.
Model.where(:id => params[:ids]).destroy_all
ids = params[:ids].split(",")
Model.where(:id => ids).destroy_all