rails 3 habtm delete only association

Andrei S picture Andrei S · Feb 14, 2011 · Viewed 12.4k times · Source
class Company
  has_and_belongs_to_many :users
end

class User
  has_and_belongs_to_many :companies
end

when i delete a company, what's the best (recommended) way to delete ONLY the associations of the users from that company? (i mean not the actual users, only the associations)

Answer

pduey picture pduey · Jun 15, 2011

I prefer the following since it keeps model logic in the model. I don't understand why ActiveRecord doesn't just do it. Anyway, in both joined models, I add the following callback.

before_destroy {|object| object.collection.clear}

So in your example:

class Company
  has_and_belongs_to_many :users
  before_destroy {|company| company.users.clear}
end

class User
  has_and_belongs_to_many :companies
  before_destroy {|user| user.companies.clear}
end

In a lot of discussions around doing a cascade delete on a collection association, many people declare the HABTM association dead and recommend has_many :through instead. I disagree. Use whatever makes sense. If the association has no intrinsic attributes, then use HABTM.