整合Ruby中的整数(在轨道上)

时间:2011-02-10 12:49:12

标签: ruby-on-rails ruby consolidation

我有一个包含两个整数(a和b)的类以及对实体的引用。

我希望能够在课堂上报告所有a和b的总和。

E.g。我可能有三条记录:

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

我希望我的综合结果为17,而b 11。

我对这方面的最佳方法感兴趣。现在我可以动态地总结一切,但是如果有很多记录可能会很慢。

或者我可以维护一个包含合并结果的假实体,并在每次更新任何其他对象时更新。

或者我可以为合并日期设置不同的课程?

所有的想法都很受欢迎。

由于 克里斯

3 个答案:

答案 0 :(得分:1)

我认为你需要一个类方法,例如:

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

如果要缓存它,可以使用名为@@cache_invalid的类变量,并在ab更改时将其设置为true。然后你可以检查一下,如果为false则返回一个缓存的值,如果为true则运行上面的代码(我现在编辑了代码以包含这个更改)。

答案 1 :(得分:1)

最简单的方法是在课堂上跟踪这些信息。例如,假设我们有许多FruitBaskets可能包含任意数量的applesbananas。在任何时候,我们都想知道所有篮子里的苹果和香蕉的总数。

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 

你去吧!

答案 2 :(得分:0)

我认为你可以选择两种方式:

  1. 急切地计算ab的总和,总是在任何这些变化时
  2. 懒惰地计算,只有当有人需要合并值
  3. 时才计算

    您应该知道上述哪种型号更符合您的需求。我会采取以下方式急切的方式:

    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的值。