Только что столкнулся с проблемой с 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?
Открыть к любым предложениям о лучших практиках в таком сценарии.
Спасибо!