Почему отрицательный голос? Это глупо, но выглядит как реальное решение проблемы.

о столкнулся с проблемой с has_many: через ассоциацию и обратные вызовы after / before-destroy не запускаются.

Скажем, у меня есть пользователи, группы и промежуточное отношение, называемое членством. У меня есть форма, которая позволяет пользователям регистрироваться в группах, создавая новую запись о членстве, когда они отмечают соответствующие флажки. В основном массив 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 не срабатывает!

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

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

Hmmmmmm ...

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

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

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

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос