Ruby on rails RubyonRails:在调用时避免无限循环。在更新期间保存

Ruby on rails RubyonRails:在调用时避免无限循环。在更新期间保存,ruby-on-rails,infinite-loop,Ruby On Rails,Infinite Loop,我有一个订单模型,有很多:项目。每个项目都有项目。所述项目成本的价格。我想为订单加上订单中的所有商品价格。总价。现在我正和你一起做这件事 after_save :update_total_price, :if => "self.saved.nil? " def update_total_price self.total_price = Item.find(item_ids).inject(0){|sum,item| sum + (item.price * item.amoun

我有一个订单模型,
有很多:项目
。每个项目都有
项目。所述项目成本的价格
。我想为
订单加上订单中的所有商品价格。总价
。现在我正和你一起做这件事

after_save :update_total_price, :if => "self.saved.nil? "


def update_total_price
     self.total_price = Item.find(item_ids).inject(0){|sum,item| sum + (item.price * item.amount) } #amount is how many items there are
     self.saved = 1
     self.save if self.saved
end
这在我第一次输入信息时效果很好,但是如果我尝试编辑订单,则不会更新总价,因为
update\u total\u price
不会被调用,因为self.saved不是零


我该怎么做才能使模型更新,但不会继续无限循环地调用
.save

为什么不让更新的总价格不再保存数据

只需在更新前设置值:

before_save :update_total_price

def update_total_price
  self.total_price = items.find(:all).inject(0){|sum,item| sum + (item.price * item.amount) } 
end

这真是太棒了。谢谢我完全忘记了在保存之前,实际上,这不起作用,因为
Item.find(Item\u id)
需要项目的ID,但它们尚未创建,因此会导致错误。我怎样才能使它工作?只需在项目id上添加一个检查。我不知道你的意思:\n id是什么时候创建的?在初始保存时?这将导致另一个无限循环。save(false)可以避免验证,但不能避免callbacks.Oops。上面的编辑怎么样?实际上托比的答案更好,但我还是把这个留在这里。
after_save :update_total_price

def update_total_price          
   self.total_price = find_total_price
   self.save_without_callbacks
end

def find_total_price
  Item.find(item_ids).inject(0){|sum,item| sum + (item.price * item.amount) 
end