2011-08-14 22 views
1

假設我有以下結構:的Rails 3:模型之間的數學

parts model: 
- title 
- weight 
- part_type_id 

part_type model: 
- quotation 

我想成立一​​個「價格」的各個部分。模型使用關聯(部分:has_one)和(part_types:belongs_to)。還行吧。

所以,基本上我在做什麼是創建一個虛擬屬性是這樣的:

class Parts < ActiveRecords::Base 
    .. 
    attr_accessor :price 

    def price 
    quotation = PartType.find(self.part_type_id).quotation 
    price = self.weight * quotation 
    end 
end 

我可以從這樣的觀點稱之爲:

<% @parts.each do |part| %> 
    <%= part.title %> 
    <%= part.price %> 
<% end %> 

這是「正確的「這樣做的方式,或者我該怎麼做?

回答

1

您可能需要使用attr_reader是偏執:

attr_reader :price 

改變自身的價格並沒有太大的意義的話,因爲他們真的要來報復你,這是最好的做掉隨着這一小變化,可能會出現一整類錯誤。然後,你要改變你的訪問,直接與實例變量的工作,attr_reader創建:

def price 
    return @price if(@price) 
    @price = PartType.find(self.part_type_id).quotation * self.weight 
end 

大概既不nil也不false是有效的價格,所以你不必擔心一遍又一遍地計算@price再次如果if(@price)失敗;計算應該只發生一次,因爲實例變量在首次訪問時自動初始化爲nil

除了上面提到的小小黑洞以外,看起來足夠明智。

+0

謝謝所有的解釋,首先我對使用'attr_accessor'和'attr_reader'感到困惑,但似乎如果它是一個只讀屬性,我真的應該去'attr_reader'。所以這樣看起來不錯。 –