Как вызвать уничтожение обратных вызовов для объекта, который является частью модели соединения, которая автоматически удаляет этот объект?
-
27-10-2019 - |
Вопрос
Рельсы 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
Мой вопрос: как я могу вызвать этот обратный вызов, когда подписка автоматически удалена из -за модели соединения?
Решение
Отвечая на ваш ответ в HMT collection_singular_ids = Удаление моделей соединения является прямым, не запускаются никакие вызовы уничтожения
Измените эту строку:
has_many :users, :through => :memberships
К этому:
has_many :users, :through => :memberships, :after_remove => :your_custom_method
И определить защищенную your_custom_method в пользовательской модели. Таким образом, когда пользователь удаляет подписку на какой -то источник, этот метод вызывается.
Удачи!
Другие советы
@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
От RDOC:
collection.delete (объект,…)
Удаляет один или несколько объектов из коллекции, установив их иностранные ключи на NULL
. Анкет Объекты будут дополнительно уничтожены, если они связаны с :dependent => :destroy
, и удалили, если они связаны с :dependent => :delete_all