2011-05-04 5 views
7

J'essaie de supprimer un tableau d'utilisateurs mais la façon dont je l'ai il est en train de supprimer un par un. Y a-t-il une meilleure façon de le faire?Rails 3 supprimer tous les éléments d'un tableau

Mon code est:

@users ||= User.where("clicks_given - clicks_received < ?", -5).to_a 
@users.each do |user| 
    user.destroy 
end 

Répondre

12

Vous pouvez simplement utiliser les méthodes intégrées de Rails. Notez que vous devez envelopper votre requête dans un tableau (si vous interpolez des variables) lorsque vous utilisez ces méthodes.

itérer sur chacun appelle détruire (qui se déroulera callbacks, etc.):

User.destroy_all(["clicks_given - clicks_received < ?", -5]) 

Ou simplement supprimer ces derniers dans la base de données en une seule requête (pas d'itération sur chaque élément), vous pouvez pour ce faire, mais gardez à l'esprit, il ne fonctionnera pas vos callbacks:

User.delete_all(["clicks_given - clicks_received < ?", -5]) 
+0

@dmarkow, je suis juste mettre à jour ma réponse avec destroy_all aussi bien - ne pas essayer de copier votre réponse. – McStretch

+0

Pas de soucis - je vous ai upvoted :) –

+0

Et je vous ai mis à jour les deux. Cependant il a dit que 'delete_all' et' destroy_all' ne peuvent pas prendre deux arguments. –

10

Vous pouvez utiliser la méthode destroy_all:

User.destroy_all("clicks_given - clicks_received < ?", -5) 

Référence:http://apidock.com/rails/v3.0.5/ActiveRecord/Relation/destroy_all

J'ai aussi utilisé ce qui suit avant:

@users.map(&:destroy) 

C'est essentiellement la même chose que chaque appel, mais vous pouvez éviter le code de la plaque de chaudière.

Questions connexes