产品模型具有一个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
答案 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
是多余的。