假设我有一个名为Apples的ActiveRecord,我想要一个类方法来计算我数据库中每个苹果的总价格,如下所示:
def Apples.total_price
Apples.sum(:price)
end
这是我在其中一个视图中用来制作饼图的方法。所以,像: Apples.brand(“红色美味”)。总和(:价格)/Apples.total_price =饼图的百分比
Apples.brand(“fuji”)。sum(:price)/Apples.total_price =饼图的另一个百分比
重复调用Apples.total_price,但此时此值不会更改。 A)Rails是否重复进行查询,还是知道缓存值?如果它反复调用它,那么在Apple中定义一个方法的最佳方法是什么,这个total_price只是为这个视图的运行时计算一次?
答案 0 :(得分:4)
你定义它的方式,我相信它是反复完成的。日志肯定会显示出来。
通过称为memoization的技术,您只在需要时处理它。 Rails为实例方法提供了简单的memoization,但是你可以自己使用类方法。
以下是如何为类方法滚动自己的memoization。
class Apple < ActiveRecord::Base
cattr_reader :total_price
def Apple.total_price
@@total_price ||= Apples.sum(:price)
end
end
答案 1 :(得分:1)
第一种方式
def total_price
@total_price ||= calc_total_price
end
还有memoize方法。所以你也可以这样做
def total_price
#you long running code goes here
end
memoize :total_price
您可以在这里找到一些细节:
http://ryandaigle.com/articles/2008/7/16/what-s-new-in-edge-rails-memoization