2011-02-10 10 views
0

私は2つの整数(aとb)とエンティティへの参照を含むクラスを持っています。Rubyでの整数の統合(レール上)

クラス内のすべてのaとbの合計をレポートできます。

など。私は17であること、そしてb 11

のために、私はこれまで最善のアプローチ上のビューに興味がありますするための私の連結結果が欲しい

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

:私は3つのレコードを持っているかもしれません。今、私はその場ですべてを集めることができますが、遅くなる可能性のあるレコードがたくさんあるとします。

または、私は統合結果を含む偽のエンティティを維持することができ、他のオブジェクトが更新されるたびに更新されます。

また、別のクラスを連結日に使用できますか?

すべてのご意見をいただきました。

おかげ クリス

答えて

1

私は、あなたがクラスのメソッドを必要とするようなものだと思う:あなたはそれがキャッシュされたい場合は、例えば@@cache_invalidと呼ばれるクラス変数を持っており、これを設定することができ

def self.consolidated_a 
    if @@cache_invalid 
    @@cached_a = all.collect(0) { |sum, x| sum + x.a } 
    end 
    @@cached_a 
end 

をいつでもtrue aまたはbが変更されます。次に、これをチェックし、falseの場合はキャッシュされた値を返し、trueの場合は上のコードを実行します(この変更を含めるようにコードを編集しました)。

0

は、私はあなたがから選択することがあります二つの方法を参照してください。誰かが連結値を必要とする場合にのみ、ときに、これらの変更のいずれかの

  • 計算なまけ

    1. 計算abの合計熱心に、常に

    あなたのニーズに合ったモデルがどれか分かるはずです。怠惰な方法はABCounterのすべて作成されたインスタンスを通過し、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 
    

    :私は熱心な道に以下の方法を置きます。

  • 1

    最も簡単な方法は、クラス内のこの情報を追跡することです。たとえば、​​とbananasの任意の数を含む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 
    

    あなたが行きます!

    関連する問題