2011-11-11 3 views
4

Что не так с этим before_save-callback?mark_for_destruction in before_save

class Order < ActiveRecord::Base 

    has_many :line_items, :dependent => :destroy, :inverse_of => :order 
    accepts_nested_attributes_for :line_items 
    attr_accessible :line_items_attributes 


    before_save :mark_line_items_for_removal 

    def mark_line_items_for_removal 
     line_items.each do |line_item| 
     line_item.mark_for_destruction if line_item.quantity.to_f <= 0 
     end 
    end 
end 

Когда один из line_items отмечены для уничтожения, не line_item не будут сохранены. Однако родительский объект Order сохраняется. Возвращение правда не делает разницы ...

о mark_for_destruction: http://apidock.com/rails/v3.1.0/ActiveRecord/AutosaveAssociation/mark_for_destruction и почему, что вместо ": allow_destroy => правда"? см. здесь: http://weblogs.manas.com.ar/spalladino/2010/03/15/deleting-children-with-accepts_nested_attributes_for-in-rails/

+0

Возможно, есть некоторые проблемы с 'if line_item.quantity.to_f <= 0'? Вы уверены, что это не всегда неверно? – WarHog

+0

Нет, я проверил с помощью 'puts line_item.marked_for_destruction?' после этого line. Это дало ожидаемый результат. Но когда один из них был отмечен, ни один из них не был спасен ... – NovapaX

+0

Вы когда-нибудь нашли ответ для этого? Я заметил, что маркировка дочернего элемента для уничтожения приведет к тому, что бот не будет сохранен, а следующий элемент (IE: -1,1,2 - сохранит только 2) – bmihelac

ответ

3

Я считаю, вам нужно установить: autosave => true вариант для определения has_many.

Как уже говорилось, здесь:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

«Если это правда, всегда сохранять связанные объекты или уничтожить их, если помечена для уничтожения, при сохранении родительского объекта Если ложь, никогда не сохранить или уничтожить ассоциированная. объекты. По умолчанию сохраняются только связанные объекты, которые являются новыми записями ».