我正在使用具有一个Project
模型的外部框架(redmine) has_many EnabledModules
。
项目可以通过模块名称“附加”或“删除” EnabledModules,如下所示:
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
我想检测何时通过回调 on 附加/删除新模块EnabledModule
,如果可能,不要修改“原始源代码”。
我可以像这样检测“附件”:
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
我认为 abefore_destroy
可以用于检测删除,但它不会。发生这种情况是因为enabled_modules.clear
对 , 的调用Project.enabled_module_names=
不会在模块上调用“销毁”。它只是将它们project_id
设置为零。所以我想我应该使用after_update
or before_update
。
如果我使用after_update
,我怎样才能得到“以前的” project_id
?
如果我使用before_update
,如何区分“刚刚更新”的模块和 project_id 将被重置为零的模块?
我应该在这里使用完全不同的方法吗?
编辑:我刚刚发现我可以用'_was'(即self.project_was
)获得旧值。但是,collection.clear
似乎不会触发更新回调。还有其他解决方案吗?
编辑 2:更改标题