Ruby on rails Ruby-before\u验证触发无限回调循环
产品模型具有属性_1。如果属性_1需要重新计算,则在_验证之前将调用。它给出了Ruby on rails Ruby-before\u验证触发无限回调循环,ruby-on-rails,ruby,ruby-on-rails-3,callback,Ruby On Rails,Ruby,Ruby On Rails 3,Callback,产品模型具有属性_1。如果属性_1需要重新计算,则在_验证之前将调用。它给出了SystemStackError:堆栈级别太深,因为self.save在验证前触发。如何停止回调的无限循环 before_validation :method_1, :if => :recalculation_required_attribute def method_1 #### #### if self.lock_version == Product.find(self.id).lo
SystemStackError:堆栈级别太深
,因为self.save代码>在验证前触发。如何停止回调的无限循环
before_validation :method_1, :if => :recalculation_required_attribute
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
我使用的是乐观锁定,使用的是lock\u version
”“全部更新”不会增加锁定版本。所以我使用save代码>。它呼唤着无限的回电
before_validation :method_1, :if => :recalculation_required_attribute
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
你不需要self.save代码>那里:您已经在事务中,所以只要做您想做的事情,让Rails在完成后保存记录即可
旁注:
Product.where(:id=>self.id).update\u all(attributes)
可能会被重写为products.update\u all(attributes)
(具有关联此模型有多个:products
self.attributes=attributes
是冗余的,除非attributes
是实例方法
您不需要self.save!
那里:您已经在事务中,所以只要做您想做的事情,让Rails在完成后保存记录即可
旁注:
Product.where(:id=>self.id).update\u all(attributes)
可能会被重写为products.update\u all(attributes)
(具有关联此模型有多个:products
self.attributes=attributes
是冗余的,除非attributes
是实例方法
您不需要保存此记录,它将被保存。@MarekLipka Lipka我使用的是使用锁定版本的乐观锁定。“全部更新”不会增加锁定版本。因此我使用的是“保存”。。它调用的是回调的无限外观。您不需要保存此记录,它将被保存。@MarekLipka Lipka我使用的是乐观锁定版本。@使用锁定版本锁定。“全部更新”不会增加锁定版本。因此,我使用的是save!。它调用的是回拨的无限外观。我使用的是锁定版本的乐观锁定。“全部更新”不会增加锁定版本。因此我使用的是save!。它调用的是回拨的无限外观。@极客们想一想。你正在使用transaction,它要等到验证之前
才能保存记录。在验证之前
中,你要保存!
在验证之前再次运行,在验证之前运行保存!
我希望你明白我的意思是的,你是对的,你能建议如何运行吗,如果b只有一次验证之前?@极客如果你试图增加lock\u版本
只需使用self.lock\u version=lock\u version+1
或者任何新的lock\u版本
迭代会导致lock\u版本
是自动增加的,如果我通过update\u all
进行,乐观锁定将不会成功工作。我正在使用锁定版本使用乐观锁定。“全部更新”不会增加锁定版本。因此我正在使用save!。它正在调用回调的无限外观。@极客们想想看。你在事务中,它在等待验证完成之前保存记录。在验证之前你要执行保存
在验证之前运行
再次运行,在验证之前运行保存!
在验证之前运行
哪个…我希望你明白我的观点是的,你是对的,如果在验证之前只运行一次,你能建议如何运行吗?@极客如果你试图增加锁定版本
只需使用self.lock\u version=lock_版本+1
或新迭代的锁定版本
将导致锁定版本
自动递增,如果我通过更新所有
执行此操作,乐观锁定将不起作用。