2014-03-05 26 views
5

我有一个模型,它存储零售店的详细信息。rails after_save无限循环

在直销模式,我过滤

after_save :is_outlet_verified 

def is_outlet_verified 
    if self.latitude.present? && self.longitude.present? 
     self.update_attributes(:is_verified => true) 
    else 
     self.update_attributes(:is_verified => false) 
    end 
    end 

我想is_verified字段设置为true如果出口地理编码之前有一个。但是,当is_outlet_verified成功执行时,会触发after_save回调,这会再次触发is_outlet_verified。

回答

16

理想情况下,你会做这样的事情在一个before_save回调,而不是after_save - 只需设置is_verified属性,然后只需按正常方式进行保存即可。

如果您确实需要这样做,您可以使用update_column而不是update_attribute,它将跳过所有回调。

需要注意的一点 - 如果before_save回调返回false,则保存不会继续。

+0

你有一个小错字方法名称'update_columns'为http://apidock.com/rails/ActiveRecord/Persistence/update_columns – theDrifter

4

.update_attributes调用.save方法,所以调用它after_save创建了一个无限循环

我会做before_save,像这样:

before_save :is_outlet_verified 

    def is_outlet_verified 
    if self.latitude.present? && self.longitude.present? 
     self.is_verified = true 
    else 
     self.is_verified = false 
    end 
    end 
+0

我尝试过,但它不更新“is_verified”字段。 – CodeMaster123

+0

获取任何错误? –

+1

不,但在更新sql查询中,它不会更新is_verified字段。 – CodeMaster123

2

您可以使用after_create代替after_save避免infinte环路发生由update_attributes

+0

但我想执行该方法,每次我对给定的记录进行任何更改。 – CodeMaster123

+0

然后使用'after_commit' https://github.com/rails/rails/commit/da840d13da865331297d5287391231b1ed39721b –