我想在某些情况下覆盖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缓存性能提升的情况下使用此技术?
答案 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
。
希望这有帮助。