HMT collection_singular_ids = удаление моделей соединения происходит напрямую, обратные вызовы уничтожения не запускаются

Только что столкнулся с проблемой с has_many: через ассоциацию и обратные вызовы после / до уничтожения не запускаются.

Скажем, у меня есть пользователи, группы и промежуточное отношение, называемое членством. У меня есть форма, которая позволяет пользователям регистрироваться в группах путем создания новой записи о членстве, когда они устанавливают соответствующие флажки. В основном это массив group_ids.

Выглядит примерно так:

Which group would you like to join? (check all that apply)
[] Group A
[] Group B
[] Group C

И я хочу записывать такие действия, как присоединение к группе или выход из группы, в таблицу журнала активности и делать другие менее важные дела.

У меня есть следующее определение:

class Group < AR::Base
  has_many :memberships
  has_many :users, :through => :memberships
end

class Membership < AR::Base
  belongs_to :user
  belongs_to :group

  after_create :log_event_to_audit_table
  after_destroy :log_event_to_audit_table

end

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships

  attr_accessible :group_ids   # enables mass-assignment
end

Когда создается новая запись о членстве, after_create запускается, как ожидалось. Однако after_destroy не запускается!

После поиска в Google и прочтения документации я обнаружил причину:

«Автоматическое удаление моделей соединения является прямым, обратные вызовы уничтожения не запускаются » - из Руководства по Ruby .

Хмммммм ...

Итак, обратные вызовы уничтожения модели соединения (в данном случае членства) не запускаются. Что ж, это угнетает. Есть ли причина относительно того, почему?

Итак, мой вопрос, как лучше всего обойти эту проблему? Должен ли я определить свой собственный метод members_ids = в модели User, который напрямую вызывает members.destroy?

Открыть к любым предложениям о лучших практиках в таком сценарии.

Спасибо!

9
задан Swartz 16 December 2010 в 19:54
поделиться