比如
class ItemLog < ActiveRecord::Base
def get_address
http_get('http://x.com/get_address_by_item_type?id=' + self.type_id).to_json['address']
end
end
那么比如遍历 500 个 ItemLog 输出 json,包括 get_address 字段,那么就得对应 500 次 http 请求。
其实 type_id 是有限的几种,可以搞个缓存
address_cache = Hash[ItemLog.where(...).limit(500).pluck(:type_id).uniq.map {|type_id| [type_id, get_address(type_id)] }]
ItemLog.where(...).limit(500).each { |item| item.address = address_cache[item.type_id }
显示 cache 明显的缺点就是需要两次遍历数据,一次得到所有唯一的 type_id,一次去处理最终 json 输出。
我的问题是,可否避免在代码上下文显示搞缓存,可否在 model 里直接搞个类似 scope cache 的东东?
class ItemLog < ActiveRecord::Base
def address
address_cache[self.type_id] || http_get('http://x.com/get_address_by_item_type?id=' + self.type_id).to_json['address']
end
end
大家一般是怎么处理的呢?