如何在仍然利用缓存的同时覆盖ActiveRecord关联方法?

时间:2012-08-26 21:10:38

标签: ruby-on-rails ruby

我想在某些情况下覆盖ActiveRecord的关联方法(与缓存间接belongs_to关系的外键有关。一个典型的例子是QuoteStop有一个Stop和一个{ {1}}有一个Stop我想在PostalCode级别缓存postal_code_id

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

QuoteStop

问题是这似乎绕过了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 的缓存。例如,以下内容将导致n + 1个查询,其中只能得到2。

postal_code

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

1 个答案:

答案 0 :(得分: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本身(实例)都不会知道之前检索过的PostalCode

希望这有帮助。