我在rails中遇到了after_save和after_commit回调的区别,我发现主要区别是在创建和更新时调用after_commit,有没有办法只在create上调用after_commit?
答案 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
create
,update
和destroy
点击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,除非我有充分的理由不这样做。