0

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

我希望能够报告班级内所有 a 和 b 的总和。

例如,我可能有三个记录:

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

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

我有兴趣了解解决此问题的最佳方法。现在我可以即时总结所有内容,但如果有很多记录可能会很慢。

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

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

所有的想法都表示赞赏。

谢谢克里斯

4

3 回答 3

1

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

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

如果你想缓存它,你可以有一个类变量@@cache_invalid,例如,并随时将其设置为 trueab更改。然后你可以检查一下,如果为假则返回一个缓存值,如果为真则运行上面的代码(我现在已经编辑了代码以包含此更改)。

于 2011-02-10T12:54:28.950 回答
1

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

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 

给你!

于 2011-02-10T14:11:34.453 回答
0

我看到您可以选择两种方式:

  1. a总是在其中任何一个发生变化时计算和b热切地计算总和
  2. 懒惰地计算,仅当有人需要合并值时

您应该知道以上哪种型号更适合您的需求。我会以以下方式表达渴望的方式:

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

于 2011-02-10T13:44:53.210 回答