HMT collection_singular_ids= deletion of join models is direct, no destroy callbacks are triggered

After carefully examining the API docs, it turns out has_many and has_and_belongs_to_many ("HABTM") have a few options just for this case:

  • before_add
  • after_add
  • before_remove
  • after_remove

class User < ActiveRecord::Base
  has_many :groups, :through => :memberships, :after_remove => :your_custom_method
end

Judging by how many responses I got, this must not be a very well documented/used feature.

Just noting it here for myself and others who may stumble like I did.