Nested Attributes For HABTM - Deleting The Right Record

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.