I just did that this morning. On Thursday, December 17, 2015, spike22 <bren...@spikeinsights.co.nz> wrote:
> Hi Eric, that's really interesting! I'll give it a whirl and report back > :) I might do a documentation pull request to clarify this too. > > Have a great day! > > Brendon > > On Friday, December 18, 2015 at 6:23:50 AM UTC+13, Eric Krause wrote: >> >> I responded on stackoverflow, but I'll do here as well so that it is >> covered everywhere on the internet. >> >> In my case I was doing something similar to what you were doing and was >> running into the same issue with the join table being deleted instead of >> destroyed. >> >> I started looking through the code and I believe the documentation is >> just out of date. >> [has_many_through_association]( >> https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/has_many_through_association.rb#L131 >> ) >> >> All you need to do is add the dependent: :destroy to the has_many >> :through relationship. >> >> class User >> has_many :partnerships, dependent: :destroy >> has_many :partners, through: :partnerships, dependent: :destroy >> end >> >> The pain I was dealing with was: >> >> user.partner_ids = [1,2,3] >> #creates the relationships >> user.partner_ids = [] >> #was deleting the records from partnerships without callbacks. >> >> The dependent: :destroy on the partners relationship fixed that. >> Callbacks are now being run and things are good again. >> >> Eric >> >> On Monday, December 14, 2015 at 5:43:57 PM UTC-7, spike22 wrote: >>> >>> 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 a topic in the > Google Groups "Ruby on Rails: Talk" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/rubyonrails-talk/eGJRC4hDDuQ/unsubscribe > . > To unsubscribe from this group and all its topics, send an email to > rubyonrails-talk+unsubscr...@googlegroups.com > <javascript:_e(%7B%7D,'cvml','rubyonrails-talk%2bunsubscr...@googlegroups.com');> > . > To post to this group, send email to rubyonrails-talk@googlegroups.com > <javascript:_e(%7B%7D,'cvml','rubyonrails-talk@googlegroups.com');>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/rubyonrails-talk/9eb239ab-b444-4b74-837d-503b589516a2%40googlegroups.com > <https://groups.google.com/d/msgid/rubyonrails-talk/9eb239ab-b444-4b74-837d-503b589516a2%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- Eric Krause -- 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/CAMtp6HebCtGxrnNExkU0S6v-cK2Q4%3D71%2B_y-g44Bos1GBRkYCw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.