ActiveRecord callback 探究

在工作中发现,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结果

ActiveRecord callback 探究_第1张图片
屏幕快照 2015-10-11 下午9.32.44.png

update结果


ActiveRecord callback 探究_第2张图片
屏幕快照 2015-10-11 下午9.34.33.png

destroy 结果

ActiveRecord callback 探究_第3张图片
屏幕快照 2015-10-11 下午9.35.39.png

touch结果

ActiveRecord callback 探究_第4张图片
屏幕快照 2015-10-11 下午9.36.39.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

费了半天功夫,rails guide是对的!

你可能感兴趣的:(ActiveRecord callback 探究)