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

坚强是说给别人听的谎言 提交于 2019-12-03 03:02:15
Swartz

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.

I've struggled with the same problem recently and solved it by extending association and overriding its delete method:

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships do
    def delete(*args)
      groups = args.flatten
      # destroy memberships in order to trigger their callbacks:
      proxy_association.owner.memberships.where(group_id: groups).destroy_all
      super
    end
  end
  ...
end

adding dependent: :destroy to the has many relationship actually calls the before_destroy and after_destroy methods in the Membership class.

class User < ActiveRecord::Base
  has_many :groups, through: :memberships, dependent: :destroy
end
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!