我试图在我的应用程序中实现审计线索,但由于某些要求,我无法使用任何现有的宝石或插件。重载和绕过活动记录更新
我想转移任何正常的尝试将模型更新到另一个单独的表(称为更新)中保存所有更新的自定义方法。
应用程序然后使用更新表来实际执行更新。
眼下我已经超负荷create_or_update得到的功能
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : create_updates
result != false
end
class Update < ActiveRecord::Base
belongs_to :updatable, :polymorphic => true
after_create :update_model
private
def update_model
self.updatable.update_attribute self.attribute, self.new_value #infinite loop
end
end
问题的第一部分,现在是时候更新模型试图实际执行更新,这会导致一个无限循环。
我一直在寻找通过铁轨核心来源找到绕过第一个功能的最佳位置。我希望这些更新在事务内部执行,但我不确定在活动记录堆栈中开始或结束的内容。我也不想开始攻击活跃的资源。
任何建议将不胜感激。
除了已预先更新之外,这与功能很接近。我已经考虑过这样的事情,但我不认为这个解决方案会捕获所有更新。例如,update_attributes也会绕过UpdateAuditor。 – stellard 2010-02-04 21:35:34
我做了你所要求的改变,但是,请阅读我的评论底部附近。 – 2010-02-06 09:32:20
非常感谢您的回复。我同意覆盖默认的更新方法可能很危险,但我不知道如何使用before_update回调完成我想要做的事情。如何在创建UpdateAudit后停止更新,而不会像更新失败那样执行相同的操作? – stellard 2010-02-09 20:47:49