Ruby before_validation触发无限循环回叫

时间:2018-10-03 09:36:26

标签: ruby-on-rails ruby ruby-on-rails-3 callback

产品模型具有一个attribute_1。如果对attribute_1需要重新计算,则将调用before_validation。它之所以产生SystemStackError: stack level too deep是因为self.save!触发了before_validation。如何停止回叫的无限循环。

before_validation :method_1, :if => :recalculation_required_attribute

我正在使用lock_version进行乐观锁定。 'update_all'不会增加lock_version。所以我正在使用save!。它正在调用无限的外观。

def method_1
    ####
    ####
    if self.lock_version == Product.find(self.id).lock_version
       Product.where(:id => self.id).update_all(attributes)
       self.attributes = attributes
       self.save!
    end
end

1 个答案:

答案 0 :(得分:3)

您不需要self.save!:您已经在事务内了,所以只要做想做的事情,让Rails在完成后保存记录即可。

侧注:

  • Product.where(:id => self.id).update_all(attributes)可能会改写为products.update_all(attributes)(具有关联this_model has_many :products
  • 除非self.attributes = attributes是实例方法,否则
  • attributes是多余的。