Как я запускаю уничтожение обратных вызовов для объекта, который является частью модели соединения, которая автоматически удаляет этот объект? - PullRequest
7 голосов
/ 30 января 2011

Рельсы 2.3.8. У меня есть 3 модели: пользователь, источник и подписка.

User  attr_accessible   :source_ids
             has_many   :subscriptions
             has_many   :sources, :through => :subscriptions

Source       has_many   :subscriptions

Subscription belongs_to :user
             belongs_to :source

У меня есть интерфейс, который позволяет пользователю редактировать свои подписки на источник. Он собирает source_ids, а также создает или удаляет подписку на основе коллекции. У меня проблема, цитата:

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

Подписки удаляются, а не уничтожаются. У меня есть обратный вызов в модели подписки, который не срабатывает:

before_destroy do |subscription|
  [Some irrelevant object not to be mentioned].destroy
end

У меня вопрос, как я могу вызвать этот обратный вызов, когда подписка автоматически удаляется из-за модели соединения?

Ответы [ 2 ]

6 голосов
/ 31 января 2011

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

Изменить эту строку:

 has_many :users, :through => :memberships

К этому:

 has_many :users, :through => :memberships, :after_remove => :your_custom_method

И определить защищенный your_custom_method в пользовательской модели. Таким образом, когда пользователь удаляет подписку на какой-либо источник, вызывается этот метод.

Удачи!

2 голосов
/ 30 января 2011
@user.subscriptions.delete
has_many   :subscriptions, :dependent => :destroy    # <- setting this on the association  will destroy the related subscriptions
has_many   :subscriptions, :dependent => :delete_all # <- setting this on the association  will delete the related subscriptions

Из документа:

collection.delete (объект,…)
Удаляет один или несколько объектов из коллекции, установив для их внешних ключей значение NULL. Объекты будут дополнительно уничтожены, если они связаны с :dependent => :destroy, и удалены, если они связаны с :dependent => :delete_all

...