我正在使用一個外部框架(redmine),它有一個Project
模型has_many EnabledModules
。Redmine插件 - 檢測模塊的啓用和禁用
項目可以具有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
我想檢測何時新模塊被附接/經由回調上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
我認爲,一個before_destroy
將用於檢測清除工作,但它不會。 發生這種情況的原因是調用Project.enabled_module_names=
,不會調用模塊上的「銷燬」。它只是將它們的project_id
設置爲零。所以我想我應該使用after_update
或before_update
。
如果我使用after_update
,我怎樣才能得到'前'project_id
?
如果我使用before_update
,如何區分'剛更新'的模塊和project_id將被重置爲nil的模塊?
我應該在這裏採用完全不同的方法嗎?
編輯:我只是found out,我可以用'_was'(即self.project_was
)得到舊值。但是,collection.clear
似乎沒有觸發更新回調。其他解決方案?
編輯2:更改標題
嗨szelmek,感謝您的快速反應,你告訴我關於ActiveRecord :: Dirty同時我正在尋找它。但是,collection.clear不會觸發after_update或before_update,所以我必須嘗試其他方法。 – kikito 2010-01-20 15:40:35