2010-07-14 4 views
0

Ok, je suis en train de détruire plusieurs enregistrements dans un before_create:before_create - détruire plusieurs enregistrements

class InventoryItem < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :item 

    before_create :replace_owned_items 

    protected 

    def replace_owned_items 
    user = self.user 
    item = self.item 

    owned_items = user.retrieve_owned_items(item) 
    unless owned_items.blank? 
     owned_items.each do |o| 
     o.destroy 
     end 
    end 
    end 

end 

Mon problème est que seul un enregistrement finit par être détruit.

L'autre est que si j'utilise détruire! (Je veux qu'une exception soit levée si elle ne détruit pas), alors je reçois une erreur tout à fait.

Comment accomplir la destruction de plusieurs enregistrements dans un before_create?

+1

pas si sûr à propos de la question, mais comme note, vos lignes 'user = self.user' et' item = self.item' sont redondantes. 'user' est déjà la même chose que' self.user', 'self' est implicite. est comme dire moi = moi :) –

Répondre

1

Vous ne pouvez pas envoyer le tableau d'ID à destroy_all avec un paramètre: id pour autant que je sache. Je tweak que l'on présente comme suit:

def replace_owned_items 
    owned_items = user.retrieve_owned_items(item).map(&:id) 
    for item in owned_items do 
    Item.destroy(item.to_i) 
    end 
end 

mais je pense que ce que vous aviez avant devrait fonctionner correctement (mon exemple ci-dessous suppose retrieve_owned_items renvoie un tableau vide s'il n'y en a pas:

def replace_owned_items 
    owned_items = user.retrieve_owned_items(item) 
    for item in owned_items 
    item.destroy 
    end 
end 
2

Et si vous essayez ceci?

def replace_owned_items 
    owned_items = user.retrieve_owned_items(item).map(&:id) 
    Item.destroy_all(:id => owned_items) unless owned_items.blank? 
end 

détruire! n'est pas une commande. Si cela ne détruit pas pour une raison quelconque, vous obtiendrez une erreur. Le bang (!) Ne serait pas nécessaire pour cette opération.

Questions connexes