在ActiveRecord中,如何指定在页面持续时间内只计算一次的类属性?

时间:2010-02-16 16:59:40

标签: ruby-on-rails ruby activerecord

假设我有一个名为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只是为这个视图的运行时计算一次?

2 个答案:

答案 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