2010-07-14 9 views
0

Хорошо, я пытаюсь уничтожить несколько записей в before_create:before_create - уничтожение нескольких записей

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 

Моя проблема заключается в том, что только одна запись заканчивается разрушается.

Другое, что если я использую уничтожение! (Я хочу, чтобы исключение поднималось, если оно не уничтожается), тогда я получаю ошибку вообще.

Как вы можете уничтожить несколько записей в файле before_create?

+1

не уверен о вопросе, но в качестве примечания ваши строки 'user = self.user' и' item = self.item' являются избыточными. 'user' уже является тем же, что и' self.user', подразумевается 'self'. это похоже на то, что я = я :) –

ответ

1

Вы не можете отправить массив идентификаторов destroy_all с параметром: id, насколько я знаю. Я бы подправить, что один такой:

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 

, но я думаю, что было раньше должно работать нормально (мой пример ниже предполагает retrieve_owned_items возвращает пустой массив, если их нет:

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

А если вы попробуете это?

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

уничтожить! не является командой. Если по какой-либо причине он не уничтожается, вы получите сообщение об ошибке. Для этой операции не понадобится взрыва (!).

Смежные вопросы