2012-01-15 46 views
0

我花了相當一段時間SO搜索,但我堅持......的Rails 3:條件的總和before_save

我想計算base_priceproductproduct之前保存在數據庫中,但我'd想要在變體表中的required字段中作爲條件。

下面是相關代碼:

class Product < ActiveRecord::Base 
    has_and_belongs_to_many :variants 

    before_save :calculate_price 

    private 

    def :calculate_price 
    self.base_price = variants.where(:required => true).to_a.sum(&:price_fixed) 
    end 
end 

:required是一個布爾領域variants

聲明適用於已保存的產品,但是這並沒有創建一個也沒有。因此,當我創建產品時,價格爲0美元,更新時,base_price正確計算。

有人可以幫忙嗎?

+0

何時/何時將變體分配給新產品? – 2012-01-15 22:24:49

+0

變體分配給產品控制器中的產品。現在,before_save,我想更新產品的base_price。這個問題似乎與.where(:required => true)有關。 – Michael 2012-01-15 22:40:29

回答

0

所以問題是,當你在做Product[self.]variants.where(...)你做隱式的查詢像SELECT * FROM variants WHERE id = #{product.id} AND ...,但由於該產品尚未保存它沒有id呢。

但是,如果你在控制器分配變體新產品(並因此它在其self.variants收集項目),這些變種已正確設置其:required屬性,你可以使用Enumerable#select像你將任何過濾它其他陣列,例如:

def :calculate_price 
    self.base_price = variants.to_a.select(&:required).sum &:price_fixed 
end 
+0

這工作 - 謝謝你的幫助! – Michael 2012-01-16 00:24:17

0

我總是把自己與不同類型的回調混合在一起。通常,當我想從其他屬性計算屬性時,我會使用before_validationbefore_save似乎更適應,但我從來沒有按照我想要的方式工作。