2011-02-10 1 views
0

두 개의 정수 (a와 b)와 엔티티에 대한 참조를 포함하는 클래스가 있습니다.Ruby에서 정수 통합하기 (레일 위)

클래스 내의 모든 a와 b의 합계를보고 할 수 있기를 원합니다.

예.

Entity 1 2 3 
a   5 9 3 
b   8 1 2 

내가 17이 될 수있는 내 통합 된 결과를 원하고, B (11)

을 위해 나는 이것에 가장 좋은 방법에보기에 관심이 있어요 : 나는 세 개의 레코드가있을 수 있습니다. 이제는 모든 것을 합산 할 수 있었지만 느려질 수있는 많은 레코드가 있다면.

또는 통합 결과가 포함 된 가짜 항목을 유지 관리 할 수 ​​있으며 다른 개체가 업데이트 될 때마다 업데이트됩니다.

아니면 통합 날짜에 대해 다른 수업을 가질 수 있습니까?

모든 의견을 감사드립니다.

감사 크리스

답변

1

난 당신이 클래스 메소드를 필요가 있다고 생각, 뭔가 같은 :

당신이 캐시하려면
def self.consolidated_a 
    if @@cache_invalid 
    @@cached_a = all.collect(0) { |sum, x| sum + x.a } 
    end 
    @@cached_a 
end 

, 당신은 예를 들어 @@cache_invalid라는 클래스 변수를 가지고 있고,이 설정할 수 언제든지 a 또는 b 변경 그런 다음이를 확인하고 false이면 캐싱 된 값을 반환하고 참인 경우 위의 코드를 실행합니다 (이제이 변경 사항을 포함하도록 코드를 편집했습니다).

0

나는 당신이 선택할 수있는 두 가지 방법을 참조 : 누군가가 통합 된 값을 필요로하는 경우에만 때 이러한 변화의

  • 컴퓨팅 느리게

    1. 컴퓨팅 ab의 합 열심히, 항상

    위의 모델 중 어떤 모델이 더 적합한 지 알아야합니다.

    class ABCounter 
    
        @consolidated_apples = 0 
        @consolidated_pears = 0 
    
        class << self 
        attr_accessor :consolidated_apples, :consolidated_pears 
        end 
    
        attr_accessor :apples, :pears 
        def initialize 
        @apples = 0 
        @pears = 0 
        end 
    
        def apples=(x) 
        ABCounter.consolidated_apples += x - @apples 
        @apples = x 
        end 
    
        def pears=(x) 
        ABCounter.consolidated_pears += x - @pears 
        @pears = x 
        end 
    end 
    

    게으른 방법은 ABCounter의 생성 된 모든 인스턴스를 통해 이동 및 ab의 값을 요약한다 : 나는 열망하는 방법을 다음과 같은 방법을 둘 것입니다.

  • 1

    가장 간단한 방법은 클래스에서이 정보를 추적하는 것입니다. 예를 들어, applesbananas이 포함될 수있는 FruitBaskets가 있다고 가정합니다. 언제든지 모든 바구니에서 사과와 바나나의 총 수를 알고 싶습니다.

    module FruitCounter 
        attr_accessor :apples, :bananas 
    
        def apples; @apples ||= 0; end 
        def bananas; @bananas ||= 0; end 
    end 
    
    class FruitBasket 
        class << self 
        include FruitCounter # Keeps track of the total for all FruitBaskets. 
        end 
    
        include FruitCounter 
    
        def apples=(v) 
        d = v - self.apples  # Note the difference. 
        @apples = v    # Set the new value for this instance. 
        self.class.apples += d # Adjust the total by the difference. 
        end 
    
        def bananas=(v) 
        d = v - self.bananas 
        @bananas = v 
        self.class.bananas += d 
        end 
    end 
    

    의 행동에 보자 : 그래서 좋은

    first = FruitBasket.new 
    => #<FruitBasket:0x97be6f8> 
    first.apples = 10; first.bananas = 15 
    
    FruitBasket.apples 
    => 10 
    FruitBasket.bananas 
    => 15 
    

    지금까지. 다른 바구니는 어떻습니까?

    second = FruitBasket.new 
    => #<FruitBasket:0x97b28e4> 
    second.apples = 30; second.bananas = 20 
    
    FruitBasket.apples 
    => 40 
    FruitBasket.apples == first.apples + second.apples 
    => true 
    

    그리고 지금은의 첫 번째 바구니의 내용을 수정할 수 있습니다 :

    first.apples = 3 
    => 3 
    FruitBasket.apples 
    => 33 
    FruitBasket.apples == first.apples + second.apples 
    => true 
    

    당신이 간다!