2011-08-14 6 views
1

한다고 가정 나는 다음과 같은 구조를 가지고 :레일 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으로 초기화되므로 계산은 한 번만 발생해야합니다.

위에서 언급 한 마이너 니트 이외에 충분히 감각적입니다.

+0

모든 설명을 해주셔서 감사합니다. 처음에는'attr_accessor'와'attr_reader'를 사용하는 것에 대해 혼란스러워 했었지만,'attr_reader'에 대한 readonly 속성이 될 것 같습니다. 그래서이 모양이 괜찮아 보입니다. –