Rails的after_commit和transaction_include_any_action?

来源:互联网 发布:2016淘宝刷钻价格表 编辑:程序博客网 时间:2024/05/20 00:17

了解rails的,都知道activerecord有一个after_commit的回调方法,可以在这个方法里做一下提交后的操作,比如同步数据等。
但是如果要区分本次commit是create、update还是delete怎么做呢?
有两种方式:
第一种方式是写多个方法分布处理

  after_commit :hook_on_create, :on => :create  after_commit :hook_on_update, :on => :update  after_commit :hook_on_destroy, :on => :destroy

通过这样可以写三个回调方法分别处理不同的数据。
第二种方式是在同一个方法里,通过判断当前操作的类型来分别处理,这个时候transaction_include_any_action?就要上场了。

after_commit :sync_data  private  def sync_data    if(transaction_include_any_action?([:create]))       do_something1       return    end    if(transaction_include_any_action?([:update]))      do_something2      return    end    if(transaction_include_any_action?([:destroy]))      do_something3      return    end  end

另外transaction_include_any_action?是rails4的方法,rails3中,对应的方法是transaction_include_action?
这两种方法我个人还是推荐第一种,毕竟解耦和代码就是注释是rails的设计原则,后者里面的判断逻辑还是要看代码才行。