2011-08-14 17 views
1

間の数学は、私は次のような構造を持っているとしますRailsの3:モデル

parts model: 
- title 
- weight 
- part_type_id 

part_type model: 
- quotation 

私は、各パートの「価格」を設定したいです。モデルは関連(part: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 

は、それほど意味がない、それが離れて行うのがベストですその小さな変更に伴う可能性のあるバグのクラス全体が表示されます。あなたは何度も@priceを計算心配する必要はありませんので

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

おそらくどちらnilfalseは有効な価格です:次に、あなたが直接attr_readerが作成するインスタンス変数で動作するようにあなたのアクセサを変更したいと思います再びif(@price)が失敗した場合。最初のアクセス時にインスタンス変数が自動的にnilに初期化されるため、計算は1回だけ実行する必要があります。

上記の軽微なニット以外にも、私には分かりやすいようです。

+0

ありがとうございます。最初は 'attr_accessor'と' attr_reader'の使い方が混乱していましたが、読み込み専用の属性であれば本当に 'attr_reader'に行くべきです。だからこれは大丈夫です。 –