我有一个包含两个整数(a和b)的类以及对实体的引用。
我希望能够在课堂上报告所有a和b的总和。
E.g。我可能有三条记录:
Entity 1 2 3
a 5 9 3
b 8 1 2
我希望我的综合结果为17,而b 11。
我对这方面的最佳方法感兴趣。现在我可以动态地总结一切,但是如果有很多记录可能会很慢。
或者我可以维护一个包含合并结果的假实体,并在每次更新任何其他对象时更新。
或者我可以为合并日期设置不同的课程?
所有的想法都很受欢迎。
由于 克里斯
答案 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
的类变量,并在a
或b
更改时将其设置为true。然后你可以检查一下,如果为false则返回一个缓存的值,如果为true则运行上面的代码(我现在编辑了代码以包含这个更改)。
答案 1 :(得分:1)
最简单的方法是在课堂上跟踪这些信息。例如,假设我们有许多FruitBaskets可能包含任意数量的apples
和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
你去吧!
答案 2 :(得分:0)
我认为你可以选择两种方式:
a
和b
的总和,总是在任何这些变化时您应该知道上述哪种型号更符合您的需求。我会采取以下方式急切的方式:
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
个实例,并总结a
和b
的值。