我有一个大型项目,有几个独立的数据库实例,数据库名称和不同的表名,都需要在单个Sinatra控制器中进行处理。
像这样的东西
class ItemLog < ActiveRecord::Base
def address
http_get('http://x.com/get_address_by_item_type?id=' + self.type_id).to_json['address']
end
end
所以,如果我遍历一长串的ItemLog,那么每次ItemLog 都会多次调用。
但由于ItemLog.type_id
是一个有限集,但它保存在远程数据库中,因此对于每个唯一type_id
,我们只需要发出一个http请求。
我知道如何为这样的缓存声明一个独立的哈希:
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 }
我的问题是,无论如何要为此编写更优雅的代码?像“scope cache”这样的东西就像{item_type_id:address_string}对,但是直接在封装的ActiveRecord模型中