2017-05-26 69 views
0

之前,我有一個類和汽車類部分,它看起來像下面運行。這兩個類都有一個屬性'價格'。現在Car的價格是所有零件價格的總和。另外,如果零件沒有價格,即如果汽車的一個或多個零件的價格爲零,則汽車的價格設置爲零。鋼軌before_save父對象的回調關聯的子對象保存

Class Car 
    has_many :parts 
    before_save :calculate_price 

    private 
    def calculate_price 
    # calculate the price of car by summing all parts prices. 
    end 
end 

Class Part 
    belongs_to :car, inverse_of: parts 
end 

問題

每當一個部分的價格變化,我想重新計算汽車的價格。現在,爲了這個,我加了before_save回調,但保存了部分對象之前回調運行,當我做self.parts它加載從數據庫對象的部分,而不是從內存中加載它們的,所以我沒有得到價格的更新值。如何在保存關聯的子對象之後使before_save運行或從內存中加載子對象?

+0

沒有測試 - 但嘗試改變協會** belongs_to的:汽車,inverse_of:零件,摸:真**。 [更多信息](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html) –

回答

0

你也需要把回調到Part模式,因爲要到零件的價格變化作出反應,對不對?喜歡的東西:

class Part 
    before_save :update_car_price 

    def update_car_price 
    self.car.touch if self.car.present? 
    end 
end 

沒有測試,但我認爲touch應該是足夠的,你不會有暴露Carcalculate_price

警告:如果你做很多的汽車和零部件價格的更新,這可能變得很醜陋。