Джо на правильном пути, но его ответ не решает все ваши проблемы. Вам также необходимо установить атрибут total_profit
в Invoice
. Сначала вам нужно добавить поле с соответствующей миграцией. Тогда вы захотите защитить этот атрибут с помощью
attr_protected :total_profit
Или еще лучше:
attr_accessible ALL_NON_PROTECTED_ATTRIBUTES
Также не помешает установить способ принудительного пересчета total_profit
. В конце концов у вас будет что-то вроде этого:
class Invoice < ActiveRecord::Base
has_many :invoice_items
attr_protected :total_profit
def total_profit(recalculate = false)
recalculate_total_profit if recalculate
read_attribute(:total_profit)
end
private
def recalculate_total_profit
new_total_profit = invoice_items.sum(:profit)
if new_total_profit != read_attribute(:total_profit)
update_attribute(:total_profit, new_total_profit)
else
true
end
end
end
Конечно, это может быть немного излишним для вашего конкретного приложения, но, надеюсь, это даст вам некоторые идеи о том, что может быть лучше для вас.