Ruby on Rails: предотвращение бесконечного цикла при вызове .save во время обновления - PullRequest
2 голосов
/ 18 августа 2010

У меня есть модель заказа, которая 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

. Это прекрасно работает при первом вводе информации, но если я пытаюсь редактировать заказ, total_price не обновляется, потому что update_total_price не вызывается, потому что self.saved не равно nil.

Что я могу сделать, чтобы обновление модели обновляло его, но не продолжало выполнять бесконечный цикл вызова .save

Ответы [ 2 ]

6 голосов
/ 18 августа 2010

Почему бы не сделать 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
1 голос
/ 18 августа 2010
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
...