Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mark_for_destruction in before_save

Whats wrong with this before_save-callback?

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

When one of the line_items are marked for destruction, no line_item will be saved. However the parent Order object does get saved. Returning true does not make a difference...

about mark_for_destruction: http://apidock.com/rails/v3.1.0/ActiveRecord/AutosaveAssociation/mark_for_destruction and why that instead of ":allow_destroy => true"? see here: http://weblogs.manas.com.ar/spalladino/2010/03/15/deleting-children-with-accepts_nested_attributes_for-in-rails/

like image 277
NovapaX Avatar asked Nov 11 '11 22:11

NovapaX


1 Answers

I believe you need to set the :autosave => true option for your has_many definition.

As stated, here:

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

"If true, always save the associated objects or destroy them if marked for destruction, when saving the parent object. If false, never save or destroy the associated objects. By default, only save associated objects that are new records."

like image 81
awaage Avatar answered Oct 23 '22 10:10

awaage