ActiveRecord::Base.update 的 alias_method_chain 顺序变化

alias_method_chain有非常强大的功能,使得我们对Rails的功能扩展变得很容易。考虑过当一个方法存在多个alias_method_chain时,without方法会变成什么样子呢?但一直没有做相关的调查。
在进行Rails2.2.2到2.3.8的升级过程中,终于遭遇了这个问题。
ActiveRecord::Base的update方法,有四个alias_method_chain:
base.alias_method_chain :update, :callbacks
base.alias_method_chain :update, :timestamps
base.alias_method_chain :update, :dirty
base.alias_method_chain :update, :lock

由于我们的程序会在后台处理客户的信息,而不像改变updated_at,所以公有化了update_without_timestamps,显示的调用它。而在update_without_timestamps执行后,我们需要after_update来触发缓存的清空/更新。

Rails2.2.2里,method_chain实际工作顺序如下。update_without_timestamps执行后,正确的执行了callbacks来清空缓存,我们的程序工作正常。
[quote]
update_with_timestamps # update_without_timestamps = update_with_callbacks
update_with_callbacks
update_with_dirty
update_with_lock[/quote]

但是在2.3.8下,method_chain工作顺序变化了。执行update_without_timestamps的时候,直接跳过了update_with_callbacks,程序出错。
[quote]update_with_callbacks
update_with_timestamps # update_without_timestamps = update_with_dirty
update_with_dirty
update_with_lock[/quote]

看来在享用alias_method_chain便利的同时,还要注意它的一些细节呀。

代码的修改其实很简单,只要利用ActiveRecord::Base.record_timestamps = false就好了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值