In a many-to-many relationship, defined via has_and_belongs_to_many, accepts_nested_attributes_for deletes the wrong record(s) when marked_for_destruction? == true. For example: class Ho < AR has_and_belongs_to_many :strolls, :join_table => :ho_strolls accepts_nested_attributes_for :strolls, :allow_destroy => true end class Stroll < AR has_and_belongs_to_many :hos, :join_table => :ho_strolls end attribs = {"1"=>{"_delete"=>"1", :id=>"123"}} h=Ho.first h.strolls_attributes = attribs h.save! This will delete Stroll with an id of 123 from the join table and the strolls table. This is wrong. It should only be deleted from the ho_strolls table. Though I believe there is a fix (or a debate still, maybe) on the way: https://rails.lighthouseapp.com/projects/8994/tickets/2251-associationcollectiondestroy-should-only-delete-join-table-records At any rate, I have the following work around. It assumes that I''ll never delete a stroll from the strolls tables via a hoe. What do you think? class Ho < AR has_and_belongs_to_many :strolls, :join_table => :ho_strolls accepts_nested_attributes_for :strolls, :allow_destroy => true def before_save remove_marked_strolls end def remove_marked_strolls marked = strolls.select { |stroll| stroll.marked_for_destruction? } marked.each { |stroll| stroll.delete(stroll) } #delete from join table only end end I though about doing: class Stroll < AR ... def unmark_for_deletion; @marked_for_deletion = false; end end And then unmarking in remove_marked_strolls, though this seems superfluous since the records are remove from the collection the proxy will never get to check for this condition and delete them from strolls.