Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby-before\u验证触发无限回调循环_Ruby On Rails_Ruby_Ruby On Rails 3_Callback - Fatal编程技术网

Ruby on rails Ruby-before\u验证触发无限回调循环

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

产品模型具有属性_1。如果属性_1需要重新计算,则在_验证之前将调用。它给出了
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
或新迭代的
锁定版本
将导致
锁定版本
自动递增,如果我通过
更新所有
执行此操作,乐观锁定将不起作用。