1

我想在某些情况下覆盖 ActiveRecord 的关联方法(与缓存间接belongs_to关系的外键有关。一个典型的例子是 a QuoteStophas aStop和 a Stophas aPostalCode我也想postal_code_idQuoteStop级别缓存。

对于这个例子,我想添加如下内容:

class QuoteStop
  attr_accessible :stop_id, :postal_code_id
  belongs_to :stop
  belongs_to :postal_code

  def postal_code_id
    self[:postal_code_id] or postal_code_id!
  end

  def postal_code_id!
    self.postal_code_id = stop.postal_code_id
  end

  def postal_code
    self[:postal_code_id] ? super : PostalCode.find(postal_code_id) if postal_code_id
  end

end

class Stop
  attr_accessible :postal_code_id
end

问题是这似乎绕过了postal_code. 例如,以下将产生 n+1 个查询,而它应该只产生 2 个。

QuoteStop.includes(:postal_code).limit(n).collect { |qs| qs.postal_code.name }

如何在不牺牲 ActiveRecord 缓存的性能增益的情况下使用此技术?

4

1 回答 1

0

我不确定您的代码是否正确,并且您的代码不会缓存任何内容。我会这样写:

def postal_code_id 
  @postal_code_id ||= stop.postal_code_id
end

def postal_code
  if self.postal_code_id
    @cached_postal_code ||= PostalCode.find(self.postal_code_id)
  else
    super
  end
end

但我不确定这是否会有很大的改进。因为做 和做PostalCode.find完全一样stop.postal_code

那么你认为缓存postal_code_id会如何改进缓存呢?除非您按照身份映射的思路进行思考:每个映射PostalCode只检索一次。但是,您需要在班级级别上做一些更详细的事情。因为QuoteStop它本身(实例)上的 any 永远不会知道PostalCode之前检索到的 a 。

希望这可以帮助。

于 2012-08-26T22:34:10.607 回答