在工作中发现,rails guide与其他资料中对ActiveRecord的回调顺序不太一致,因此做一个实验来确定创建、修改、删除、touch所触发的回调及顺序。
测试代码
class Product < ActiveRecord::Base
[:before_validation,:after_validation,
:before_save,
#:around_save,
:before_create,
#:around_create,
:after_create,:before_update,:around_update,
:after_update,:after_save,:before_destroy,
:after_destroy,:after_touch].each do |m|
define_method m do
logger.info "#{m} execute"
end
eval "#{m} :#{m}"
end
end
create结果
![](https://img.haomeiwen.com/i19532/b26e7132391f8e8b.png)
update结果
![](https://img.haomeiwen.com/i19532/4d4615e87223d11b.png)
destroy 结果
![](https://img.haomeiwen.com/i19532/ac3a5f0d4fcc6c9e.png)
touch结果
![](https://img.haomeiwen.com/i19532/d94d3e0497871e6f.png)
测试使用的ruby版本为2.2.3,rails版本为4.2.4,around_save和around_create会导致commit失败,目前不知原因,估计为rails的bug,综上真实的结果为
- create触发的回调(按顺序)before_validation、after_validation、before_save、before_create、after_create、after_save
- update触发的回调 before_validation、after_validation、before_save、before_update、around_update、after_update、after_save
- destroy触发的回调 before_destroy、after_destroy
- touch触发的回调 after_touch
网友评论