8 votes

Comment déclencher des rappels de destruction pour un objet faisant partie d'un modèle de jointure qui supprime automatiquement cet objet ?

Rails 2.3.8. J'ai 3 modèles, User, Source, et Subscription.

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

Source       has_many   :subscriptions

Subscription belongs_to :user
             belongs_to :source

J'ai une interface qui permet à un utilisateur de modifier ses abonnements à une source. Elle collecte les identifiants des sources et crée ou supprime un abonnement en fonction de cette collecte. Le problème que je rencontre est le suivant : quote :

"La suppression automatique des modèles de jointure est directe, aucun rappel de destruction n'est déclenché."

Les abonnements sont supprimés et non détruits. J'ai un rappel dans le modèle d'abonnement qui n'est pas déclenché :

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

Ma question est la suivante : comment puis-je déclencher ce rappel lorsqu'un abonnement est automatiquement supprimé en raison du modèle de jointure ?

7voto

Swartz Points 981

Répondant à votre réponse dans HMT collection_singular_ids= la suppression des modèles de jointure est directe, aucun rappel de destruction n'est déclenché

Modifier cette ligne :

 has_many :users, :through => :memberships

A cela :

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

Et définissez la méthode protégée your_custom_method dans le modèle User. Ainsi, lorsqu'un utilisateur supprime un abonnement à une source, cette méthode est appelée.

Bonne chance !

2voto

John Shetler Points 56
@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

Extrait du rdoc :

collection.delete(object, )
Supprime un ou plusieurs objets de la collection en fixant leurs clés étrangères à NULL . Les objets seront en outre détruits s'ils sont associés à :dependent => :destroy et supprimées si elles sont associées à :dependent => :delete_all

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X