Ruby on Rails 3: après la méthode destroy de détruire un objet si il n'y a plus d'objets liés dans le système?
J'ai un petit problème, j'ai les 2 modèles:
class CriticalProcess < ActiveRecord::Base
has_many :authorizations, :dependent => :destroy
has_many :roles, :through => :authorizations
after_destroy :check_roles
def check roles
cp_roles = self.roles
cp_roles.each do |role|
if role.critical_processes.size == 0
role.destroy
end
end
end
end
et
class Role < ActiveRecord::Base
has_many :authorizations
has_many :critical_processes, :through => :authorizations
end
Donc 1 rôle peut appartenir à de nombreux processus essentiels, est-il possible que je peux le faire que si TOUS les processus critiques que le rôle appartenait devaient être détruits, puis pour qu'il être détruit? J'ai besoin de cela parce que si tous les CP (Processus critiques) que les rôles ont une relation avec devaient être détruits alors le rôle devrait également être détruites, car il n'est plus nécessaire.
Mise à JOUR
J'ai maintenant créé un after_destroy méthode qui devrait supprimer les rôles, mais cela ne semble pas être de travail, pour une raison quelconque après le débogage en utilisant les journaux de son pas de boucle dans le tableau pour une raison quelconque?
pourquoi est-ce?
Grâce
before_destroy
filtre dans CriticalProcess
. Cravate qu'à une méthode qui vérifie self.roles
pour tous les rôles dont critical_processes
liste contient uniquement les self
(le processus critique qui est sur le point d'être détruit.salut @jdl, comment pourrais-je aller sur le faire? pouvez-vous me montrer ce que la méthode ressemble à s'il vous plaît?
OriginalL'auteur Mo. | 2011-04-05
Vous devez vous connecter pour publier un commentaire.
Peut-être vous pouvez définir la
after_destroy
rappel dans le CriticalProcess classe. À l'intérieur de laafter_destroy
vous pouvez ensuite vérifier si le Rôle associé a zéro du CP, et si oui, supprimez le Rôle.J'ai essayé mais sa ne marche pas:
def role_check roles = self.roles roles.each do |role| if role.critical_processes.size == 0 role.destroy end end end
OriginalL'auteur Upgradingdave
Le problème était que le autherization table était de se faire supprimé avant de l'auto.des rôles qui a été appelé, donc je l'ai, j'ai changé le
after_destroy
à unbefore_destroy
et fait une couple d'autres changements comme:Pas le prtiest réponse, mais il fonctionne, si quelqu'un a une meilleure réponse s'il vous plaît de les partager.
OriginalL'auteur Mo.