Ответ 1
collection.delete
выполнит трюк.
class Company
has_and_belongs_to_many :users
end
class User
has_and_belongs_to_many :companies
end
когда я удаляю компанию, какой лучший (рекомендуемый) способ удалить ТОЛЬКО ассоциации пользователей из этой компании? (я имею в виду не фактических пользователей, а только ассоциации)
collection.delete
выполнит трюк.
Я предпочитаю следующее, поскольку он сохраняет модельную логику в модели. Я не понимаю, почему ActiveRecord не просто это делает. Во всяком случае, в обеих объединенных моделях я добавляю следующий обратный вызов.
before_destroy {|object| object.collection.clear}
Итак, в вашем примере:
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
Во многих дискуссиях по поводу создания каскадного удаления в ассоциации коллекции многие люди объявляют ассоциацию HABTM мертвой и рекомендуют has_many: вместо этого. Я не согласен. Используйте все, что имеет смысл. Если ассоциация не имеет внутренних атрибутов, используйте HABTM.
Если вы вызываете destroy вместо delete, ассоциации будут удалены автоматически.