I've asked this on on Stack Overflow but didn't receive much of a response:
The Rails 4 documentation says this regarding destroy callbacks on the join model for a has_many :through relationship: collection=objects Replaces the collections content by deleting and adding objects as appropriate. If the :through option is true callbacks in the join models are triggered except destroy callbacks, since deletion is direct. Thankfully it's documented at least, but I want to know why on earth this is the case? It makes more sense to trigger destroy callbacks (or have the option to) on a :through since these types of models can have destroy callbacks and other associations. In my case I had a has_and_belongs_to_many relationship on the join tables model off to another model. The records on that second join table would never be deleted when the associated records on the first join table were deleted. I resorted to this which feels hacky, and I have to repeat myself on each side of the :through relationship: class SchoolsTemplate < ActiveRecord::Base belongs_to :school belongs_to :template has_and_belongs_to_many :groups end class School < ActiveRecord::Base has_many :schools_templates, dependent: :destroy has_many :templates, through: :schools_templates, before_remove: :remove_groups_school_templates private def remove_groups_school_templates(template) schools_templates.where(template: template).first.groups.clear end end There's a validation to 'ensure' uniqueness on the join tables records between the two foreign keys, so that's why I can call first in the callback. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-talk@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/6afe728a-9585-4431-bc96-71f6f8ceaeeb%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.