Rails after_save和after_commit回调

时间:2015-10-03 17:18:07

标签: ruby-on-rails ruby

我在rails中遇到了after_save和after_commit回调的区别,我发现主要区别是在创建和更新时调用after_commit,有没有办法只在create上调用after_commit?

4 个答案:

答案 0 :(得分:5)

您可以指定只应使用:on选项:

通过某个操作触发回调
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>


<package name="PackageName" namespace="/"
                               extends="struts1-default">
<interceptors>
  <interceptor name="LoginForm" 
   class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor">
    <param name="className">com.LoginForm</param>
    <param name="name">LoginForm</param>
    <param name="scope">request</param>
  </interceptor>


  <interceptor name="InboxForm" 
   class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor">
    <param name="className">com.InboxForm</param>
    <param name="name">InboxForm</param>
    <param name="scope">request</param>
  </interceptor>


  <interceptor-stack name="web">
    <interceptor-ref name="staticParams"/> 
    <interceptor-ref name="LoginForm"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="basicStack"/>
  </interceptor-stack>    


  <interceptor-stack name="web2">
    <interceptor-ref name="staticParams"/> 
    <interceptor-ref name="InboxForm"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="basicStack"/>
  </interceptor-stack>

</interceptors>


<action name="LoginAction" class="org.apache.struts2.s1.Struts1Action" method="execute" >
 <param name="className">com.LoginAction</param>
    <interceptor-ref name="web"/>       
    <result name="success" type="chain">FetchInboxAction</result>
    <result name="failure">/error.jsp</result>
 </action>

    <action name="FetchInboxAction" class="org.apache.struts2.s1.Struts1Action" method="execute">
 <param name="className">com.FetchInboxAction</param>
    <interceptor-ref name="InboxForm"/>
    <result name="success">/sucess.jsp</result>
    <result name="failure">/error.jsp</result>
    </action>


    </package>
</struts>

答案 1 :(得分:2)

两个回调之间的区别是不正确的。创建和更新对象时会调用after_save,除非约束为@Grammakov指出。 after_commit createupdatedestroy点击after_save

主要区别是save在模型对象after_commit方法完成后立即调用,其中<a href="<?php echo get_bloginfo('siteurl') ;?> /page_detail/?post_type=<?php echo $id_post; ?>"></a> 在记录实际提交给数据库之前不会触发。

答案 2 :(得分:0)

after_create_commit :trigger

private
  def trigger
   # Your Code
  end

答案 3 :(得分:0)

另一个很大的区别是after_save发生在与创建/保存相同的事务中。这意味着如果出现错误,则不会创建/保存对象。它还意味着创建/保存所在的行或表将被锁定,直到after_save完成。这可能导致数据库性能问题或死锁。特别是当你有几个after_save回调。一般情况下,我默认使用after_commit,除非我有充分的理由不这样做。