Just reporting back, it works as expected on my end too. Thanks for the 
feedback. This solution feels more proper :)

Linking in the PR for the documentation change for others finding this 
thread in the future: https://github.com/rails/rails/pull/22644

Cheers,

Brendon

On Friday, December 18, 2015 at 10:43:07 AM UTC+13, spike22 wrote:
>
> Haha! very good :)
>
> On Friday, December 18, 2015 at 10:39:49 AM UTC+13, Eric Krause wrote:
>>
>> I just did that this morning. 
>>
>> On Thursday, December 17, 2015, spike22 <bre...@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.
>>> 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/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/1d287ee7-5455-46f8-a7ab-2fcfd5cfbcc2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to