2

というオーダーモデルがありhas_many :itemsます。各アイテムには、そのアイテムitem.priceのコストがあります。の注文のすべての商品価格を合計したいorder.total_price。今、私はそれをやっています

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_total_priceself.saved が nil ではないために呼び出されないため、total_price が更新されません。

モデルを更新すると更新されますが、呼び出しの無限ループを続けないようにするにはどうすればよい.saveですか?

4

2 に答える 2

6

update_total_priceにデータを再度保存させないのはなぜですか。

before_updateに値を設定するだけです。

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
于 2010-08-18T07:03:10.247 に答える
1
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
于 2010-08-18T07:04:55.017 に答える