Je travaille avec un framework externe (redmine) qui a un modèle Project
qui a beaucoup de EnabledModules
.Redmine Plugins - Détection de l'activation et de la désactivation des modules
Les projets peuvent avoir EnabledModules « attachés » ou « enlevés » par le nom du module, comme ceci:
class Project < ActiveRecord::Base
...
has_many :enabled_modules, :dependent => :delete_all
...
def enabled_module_names=(module_names)
enabled_modules.clear
module_names = [] unless module_names && module_names.is_a?(Array)
module_names.each do |name|
enabled_modules << EnabledModule.new(:name => name.to_s)
end
end
end
Je voudrais détecter de nouveaux modules sont fixés/enlevés par callbacks sur EnabledModule
, et non modifier le "code source original" si possible.
Je peux détecter « pièces jointes » comme celui-ci:
class EnabledModule < ActiveRecord::Base
belongs_to :project
after_create :module_created
def module_created
logger.log("Module attached to project #{self.project_id}")
end
end
Je pensais que before_destroy
travaillerait pour détecter le transfert, mais il ne sera pas. Cela se produit parce que l'appel enabled_modules.clear
sur Project.enabled_module_names=
, n'invoque pas «détruire» sur les modules. Il définit simplement project_id
à zéro. Donc j'ai pensé que je devrais utiliser un after_update
ou before_update
. Si j'utilise after_update
, comment puis-je obtenir le 'project_id
' précédent? Si j'utilise before_update
, comment puis-je différencier les modules qui sont 'juste mis à jour' des modules dont le projet_id va être réinitialisé à 0?
Dois-je utiliser une approche totalement différente ici?
EDIT: J'ai juste found out que je pouvais obtenir les anciennes valeurs avec '_was' (c'est-à-dire self.project_was
). Cependant, collection.clear
ne semble pas déclencher de rappels de mise à jour. D'autres solutions?
EDIT 2: Titre modifié
Salut szelmek, merci pour votre réponse rapide, vous m'avez parlé d'ActiveRecord :: Dirty en même temps que je le cherchais. Cependant, ni after_update ni before_update ne sont déclenchés par collection.clear, donc je dois essayer quelque chose d'autre. – kikito