0

我在 ActiveRecord 模型上创建了一个实例变量,我想在每个实例中保存一些计算量大的数据......这是我的代码:

class Account < ActiveRecord::Base

  after_initialize :init
  attr_accessor :market_value

  def init
    self.market_value ||= my_lengthy_function
  end
end

当我初始化模型实例时,我将在其中运行该实例数据(market_value)。

这行得通 - 我可以看到我不必重新计算我的 market_value 属性。

我的问题是,当我通过另一个上下文访问该对象时,rails 并没有像我预期的那样利用该数据。

例如:

假设我创建了一个帐户实例 (a = Account.find_by_id(2))。该 market_value 将在该对象上计算一次。

如果我与该帐户对象上称为“控股”(不在我的示例代码中)的东西有嵌套的 has_many 关系,我将希望每个持有对象(控股)能够使用它的父帐户对象。

但是,在我的代码中,我从它的嵌套持有对象 (my_holding.account.market_value) 访问该帐户 - 我重新实例化了该帐户对象的一个​​实例,并产生了昂贵的计算,即使它已经被计算过。

我怎样才能更好地利用该帐户的 market_value 属性,使其不会不断重新计算?

4

2 回答 2

1

我会在类级别上建立一个简单的缓存,以模型 id 作为键:

class Account < ActiveRecord::Base
  def market_value
    @@market_value     ||= {}
    @@market_value[id] ||= my_lengthy_function
  end
end

没有测试这是否可行,尤其是在开发中重新加载类时。

于 2012-07-12T17:43:26.317 回答
1

我不会将计算逻辑放在 ActiveRecord 模型中。也许是这样的:

class MarketValueCalculator

  def initialize()
    @market_values = {}
  end

  def calculate_for_account(account)
    @market_values[account.id] ||= heavy_lifting
  end

  def heavy_lifting
    ###
  end

end

@calculator = MarketValueCalculator.new

@market_value = @calculator.calculate_for_account(account)

@market_value = @calculator.calculate_for_account(my_holding.account)
于 2012-07-13T05:37:48.530 回答